XCode向导创建的主 - 详细信息项目包含调用tableView:cellForRowAtIndexPath:
的{{1}}实现,然后调用自己的自定义方法dequeueReusableCellWithIdentifier:forIndexPath:
以使用有效数据填充单元格控件,然后返回细胞到来电者。据我了解,这就是表格知道如何绘制其单元格内容的方式。
当我想从我的代码中获取单元格时,我不明白如何使用它。它是否应该被我的代码调用,或者它只是表框架本身使用的回调?
例如,如果我只想更改单元格中一个标签的文本,我想我可以调用configureCell
,并在生成的单元格对象控件中更改我需要的内容。但是调用tableView:cellForRowAtIndexPath:
实际上会创建一个新的单元格对象(可能会从未使用的单元格对象池中重用一个)并使用数据填充所有控件,如图像视图和标签。当我想要改变一个标签时,这对我的表现来说并不好看。
也许我可以从tableView:cellForRowAtIndexPath:
中移除configureCell
?但是,当调用tableView:cellForRowAtIndexPath:
时,如何确保系统会重新绘制所有单元格内容?
P.S。 XCode 7向导创建了这种代码:
[table reloadData]
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
[self configureCell:cell withObject:object];
return cell;
}
// Then later in controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] withObject:anObject];
break;
在此处被调用两次。对我来说似乎毫无意义。我希望至少为向导编写代码的人都能理解这应该是如何工作的。
答案 0 :(得分:1)
这里有两种不同的方法,它们具有相似的名称。
tableView:cellForRowAtIndexPath:
是您实现的UITableViewDataSource
方法,用于创建要显示的表格的单元格。当一个新单元格出现在屏幕上时,tableview会调用此方法。
controller:didChange:...
正在调用名为cellForRowAtIndexPath:
的另一种方法,即UITableView
方法。此方法在表中查询先前使用tableView:cellForRowAtIndexPath:
数据源方法创建之后已显示的单元格,并且不会再次调用它。它调用此方法来访问已经显示的单元格,并在对象更改时使用新信息更新它。
两次调用configureCell
都是必要的。