初始加载时,UITableView numberOfSectionsInTableView和numberOfRowsInSection调用三次

时间:2015-05-21 10:41:47

标签: ios uitableview ios8

我正在制作一个没有任何数据源的REALLY BASIC UITableView项目。我只是在展示" 1"在第一个和唯一的细胞。

returning 1numberOfSectionsInTableView numberOfRowsInSection。我也在两个方法上做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];

3 个答案:

答案 0 :(得分:4)

在文档中没有说明这些方法只在重载数据循环中调用一次。

你已经假设他们只需要被调用一次,但正如你所示,这是一个不好的假设。

在审核了UITableViewUITableViewDataSource的文档后,唯一的承诺就是这样。

-[UITableView numberOfSections]

  

讨论

     

UITableView从其数据源获取此方法返回的值并缓存它。

这意味着您无法知道对string binary = "01001000"; var list = new List<Byte>(); for (int i = 0; i < binary.Length; i += 8) { if (binary.Length >= i + 8) { String t = binary.Substring(i, 8); list.Add(Convert.ToByte(t, 2)); } } string result = Encoding.ASCII.GetString(list.ToArray()); // H 的来电与-[UITableView numberOfSections]的来电的对应方式。

更糟糕的是,调用这些方法的次数可以(并且有)在不同版本的iOS之间进行更改。

简而言之,请制作这些方法idempotentperformant,并忘记-[UITableViewDataSource numberOfSectionsInTableView:]的实施细节。

答案 1 :(得分:3)

委托和数据源用于为表视图实现提供服务,并且可以多次调用方法。您不应该关注表视图的实现细节,只需确保您的答案是一致的(即,您可以在任何时间点正确回答,并且在不调用reloadData的情况下答案不会更改。)

答案 2 :(得分:2)

您可以尝试找出造成这些重新加载的原因。转到断点部分(1),按“加号”按钮(2)。然后在“symbol”字段中添加符号断点 - [UITableView reloadData]。 enter image description here enter image description here

然后运行您的应用程序并查看方法调用的堆栈跟踪。您将能够找出这种行为的原因。

enter image description here