我如何开始我的UITableView部分编号0当我有多个部分?

=> 我知道,这是个愚蠢的问题,但对于新的iPhone开发者来说,这一点更为重要。

这里我有与UITableView部分相关的问题:

第一个问题:我有问题,我怎么能开始我的UITableView部分编号0从多个部分?

例如 :

我在UITableViewnumberOfSectionsInTableView委托方法中有11个节号,我的节首先是第11个节号,然后是0,1,2,3,4,5,6,7,8,9和10。我用0号开始我的部分号码,然后照原样。

第二个问题:titleForHeaderInSection委托方法中,我的tableView的所有部分都重复3次。 在当前的ViewController我向上或向下滚动UITableView然后部分显示正常(0至11)UITableView显示的这个正常部分重复第3节后。

例如 :

我使用NSLog (@" %d ", section );titleForHeaderInSection委托方法,然后显示出来放在控制台,如下所示

控制台输出:

 2012-09-17 12:27:47.424 Quotes2You[1623:f803] 11 2012-09-17 12:27:47.426 Quotes2You[1623:f803] 11 2012-09-17 12:27:47.427 Quotes2You[1623:f803] 11 2012-09-17 12:27:47.428 Quotes2You[1623:f803] 0 2012-09-17 12:27:47.429 Quotes2You[1623:f803] 0 2012-09-17 12:27:47.429 Quotes2You[1623:f803] 0 2012-09-17 12:27:47.430 Quotes2You[1623:f803] 1 2012-09-17 12:27:47.431 Quotes2You[1623:f803] 1 2012-09-17 12:27:47.431 Quotes2You[1623:f803] 1 2012-09-17 12:27:47.432 Quotes2You[1623:f803] 2 2012-09-17 12:27:47.433 Quotes2You[1623:f803] 2 2012-09-17 12:27:47.433 Quotes2You[1623:f803] 2 2012-09-17 12:27:47.434 Quotes2You[1623:f803] 3 2012-09-17 12:27:47.435 Quotes2You[1623:f803] 3 2012-09-17 12:27:47.436 Quotes2You[1623:f803] 3 2012-09-17 12:27:47.436 Quotes2You[1623:f803] 4 2012-09-17 12:27:47.437 Quotes2You[1623:f803] 4 2012-09-17 12:27:47.438 Quotes2You[1623:f803] 4 2012-09-17 12:27:47.438 Quotes2You[1623:f803] 5 2012-09-17 12:27:47.439 Quotes2You[1623:f803] 5 2012-09-17 12:27:47.439 Quotes2You[1623:f803] 5 2012-09-17 12:27:47.440 Quotes2You[1623:f803] 6 2012-09-17 12:27:47.441 Quotes2You[1623:f803] 6 2012-09-17 12:27:47.462 Quotes2You[1623:f803] 6 2012-09-17 12:27:47.463 Quotes2You[1623:f803] 7 2012-09-17 12:27:47.464 Quotes2You[1623:f803] 7 2012-09-17 12:27:47.465 Quotes2You[1623:f803] 7 2012-09-17 12:27:47.466 Quotes2You[1623:f803] 8 2012-09-17 12:27:47.466 Quotes2You[1623:f803] 8 2012-09-17 12:27:47.467 Quotes2You[1623:f803] 8 2012-09-17 12:27:47.472 Quotes2You[1623:f803] 9 2012-09-17 12:27:47.476 Quotes2You[1623:f803] 9 2012-09-17 12:27:47.478 Quotes2You[1623:f803] 9 2012-09-17 12:27:47.480 Quotes2You[1623:f803] 10 2012-09-17 12:27:47.481 Quotes2You[1623:f803] 10 2012-09-17 12:27:47.481 Quotes2You[1623:f803] 10 2012-09-17 12:27:47.487 Quotes2You[1623:f803] 0 2012-09-17 12:27:47.487 Quotes2You[1623:f803] 1 2012-09-17 12:27:47.489 Quotes2You[1623:f803] 2 

首先这个重复所有部分3次和之后当我滚动UITableView然后部分从0开始(正常)

我的代码在这里:

ThirdViewController.h

 @interface ThirdViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> { UITableView *tblCustomer; NSArray *listOfsection; } @property (nonatomic,retain) UITableView *tblCustomer; @property (nonatomic,retain) NSArray *listOfsection; @end 

ThirdViewController.m

 @synthesize tblCustomer , listOfsection; - (void)viewDidLoad { [super viewDidLoad]; self.tblCustomer = [[UITableView alloc] initWithFrame:CGRectMake(0,0,320,417) style:UITableViewStyleGrouped]; self.tblCustomer.delegate = self; self.tblCustomer.dataSource = self; [self.view addSubview:self.tblCustomer]; self.listOfsection = [[NSArray alloc] initWithObjects:@"Name", @"Company", @"Address", @"Email", @"Mobile", @"Phone", @"Potential", @"Sales Status", @"Genre", @"Distributor", @"Dist Rep", @"Internal Notes", nil]; } #pragma mark - UITableView Datasource Methods - (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView { return [self.listOfsection count]; } - (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { int numSection=0; if (section == 2) numSection = 5; else numSection = 1; return numSection; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // here is my code cellForRowAtIndexPath as section wise } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSLog(@" %d ", section); NSString *sectionHeader = nil; sectionHeader = [self.listOfsection objectAtIndex:section]; // here is section overwrite // return sectionHeader; } #pragma mark - Memory Management -(void)dealloc { [super dealloc]; [self.listOfsection release]; [self.tblCustomer release]; } 

提前致谢

你问:

第一个问题:我有问题,我怎么能开始我的UITableView部分编号0从多个部分?

我假设你的惊愕源于这些不是以严格的顺序方式被引用的事实。 这就是它是如何发生的,你不能改变这种行为。 显然,你的部分在应用程序中以正确的顺序出现,但是它们不会被顺序调用。 这只是事件驱动编程的本质。 但是,我没有看到代码中的任何内容都是以这个执行顺序为基础的,但是在你的代码中可能有些东西你没有包含在这里,那就需要严格地按顺序调用这些方法,如果是的话,必须重构该代码。 但是我在上面的代码片断中看不到任何东西。 UITableViewDataSource委托方法的本质意味着您可以(也应该)以这样的方式编写您的方法,使得它们不依赖于调用单元或部分的顺序。 永远不要依赖UI中的事件序列来控制如何构build视图的基础模型。

第二个问题:在titleForHeaderInSection委托方法中,我的tableView的所有部分都重复3次。 在当前的ViewController我向上或向下滚动UITableView然后部分显示正常(0至11)UITableView显示的这个正常部分重复第3节后。

如果连续三次被调用,我会感到惊讶。 我打赌(特别是给你的日志显示略有不同格式的NSLog语句的证据),你的代码中有其他的NSLog语句。 我会尝试改变你的NSLog语句如下所示:

 NSLog(@"%s section=%d", __FUNCTION__, section); 

这样,(a)你知道从哪个方法login; 和(b)通过在格式化string中添加描述性的"section=" ,这意味着如果您不会对logging什么数字感到困惑。 我敢打赌,并不是所有这三个NSLog语句都来自您的titleForHeaderInSection 。 就我个人而言,如果没有__FUNCTION__引用,我不再把NSLog语句放在代码中,因为它太容易混淆了什么是生成什么NSLog语句。

但即使titleForHeaderInSection被多次调用,那又如何呢? iOS已经在幕后进行了优化,可以做各种各样的东西。 对我们来说,理解正在发生的事情是很好的(例如,为了确保你不会像titleForHeaderInSection那样做一些计算密集或者networking密集型的活动),但是现在是接受平静祷告的时候,并且要感谢开发者已经掌握了什么以及我们没有的东西。 (而且UITableViewDataSource调用的顺序和数量是我们无法控制的那些东西之一。)只要你不是对方法的冗余调用(例如做不必要的reloadData调用)的源头,我不会担心关于它。

总而言之,如果titleForHeaderInSection被连续调用三次,我会感到惊讶,不要只依赖它被调用一次。 我认为表视图可能会调用一次为表的每个部分(可能需要做一些事情,如弄清整个表的高度,以便滚动条的大小适当),然后再次为屏幕上可见的部分(实际显示部分标题)。

 -(NSInteger)numberOfRowsInTotal { NSInteger sections = self.numberOfSections; NSInteger cellCount = 0; for (NSInteger i = 0; i < sections; i++) { cellCount += [self numberOfRowsInSection:i]; } return cellCount; } 

这不正确的方式,但你可以使用下面的代码和它的工作完美。

 [self reloadDataWithCompletion:^{ communityFoundIndex = [[NSMutableArray alloc]init]; NSRange range = NSMakeRange(0, 1); NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range]; [self.myTbl reloadSections:section withRowAnimation:UITableViewRowAnimationNone]; }]; - (void) reloadDataWithCompletion:( void (^) (void) )completionBlock { [_tblCommunity reloadData]; if(completionBlock) { completionBlock(); } }