UITableView numberOfSectionsInTableView和numberOfRowsInSection在初始加载时调用三次
我正在做一个没有任何数据源的REALLY BASIC UITableView
项目。 我只在第一个和唯一的单元格上显示“1”。
我在numberOfSectionsInTableView
和numberOfRowsInSection
都returning 1
。 我也做了一个NSLog
的两个方法简单地说明各自的方法的名称。
在初始加载时,我得到这个:
SomeShit[27511:936083] number of sections SomeShit[27511:936083] number of rows in section SomeShit[27511:936083] number of sections SomeShit[27511:936083] number of rows in section SomeShit[27511:936083] number of sections SomeShit[27511:936083] number of rows in section
为什么这些方法调用三次? 纠正我,如果我错了,但这真的很奇怪。 我以为他们应该只打一次,因为在这两个项目的数量是1。
编辑:
我在做什么viewDidLoad
,
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain]; [self.view addSubview:self.tableView]; self.tableView.dataSource = self; self.tableView.delegate = self; [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];
委托和数据源在那里为表视图实现提供服务,并且可以多次调用方法。 你不应该关心表视图的实现细节,只要确保你的答案是一致的(即你可以在任何时候正确地回答,没有调用reloadData
就不会改变答案)。
在文档中没有任何地方说这些方法只在重载数据周期中调用一次。
你已经假设他们只需要被调用一次,但正如你所表明的那样,这是一个不好的假设。
在审查了UITableView
和UITableViewDataSource
的文档后,唯一的承诺是这样的。
-[UITableView numberOfSections]
:
讨论
UITableView从数据源中获取这个方法返回的值并caching它。
这意味着你不知道如何调用-[UITableView numberOfSections]
将与调用-[UITableViewDataSource numberOfSectionsInTableView:]
相对应。
更糟的是,这些方法被调用的次数可以(并且)在不同版本的iOS之间改变。
简而言之,使这些方法是幂等和高性能的 ,忘记了UITableView
实现细节。
你可以尝试找出是什么导致这些重新加载。 转到断点(1),按“加”button(2)。 然后在“symbol”字段中添加符号断点 – [UITableView reloadData]。
然后运行您的应用程序并查看方法调用的堆栈跟踪。 你将能够找出这种行为的原因。