我正在制作一个没有任何数据源的REALLY BASIC UITableView
项目。我只是在展示" 1"在第一个和唯一的细胞。
我returning 1
和numberOfSectionsInTableView
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];
答案 0 :(得分:4)
在文档中没有说明这些方法只在重载数据循环中调用一次。
你已经假设他们只需要被调用一次,但正如你所示,这是一个不好的假设。
在审核了UITableView
和UITableViewDataSource
的文档后,唯一的承诺就是这样。
-[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之间进行更改。
简而言之,请制作这些方法idempotent和performant,并忘记-[UITableViewDataSource numberOfSectionsInTableView:]
的实施细节。
答案 1 :(得分:3)
委托和数据源用于为表视图实现提供服务,并且可以多次调用方法。您不应该关注表视图的实现细节,只需确保您的答案是一致的(即,您可以在任何时间点正确回答,并且在不调用reloadData
的情况下答案不会更改。)
答案 2 :(得分:2)
您可以尝试找出造成这些重新加载的原因。转到断点部分(1),按“加号”按钮(2)。然后在“symbol”字段中添加符号断点 - [UITableView reloadData]。
然后运行您的应用程序并查看方法调用的堆栈跟踪。您将能够找出这种行为的原因。