如何使用tableView:cellForRowAtIndexPath:?

时间:2017-01-24 18:53:44

标签: ios xcode uitableview

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; 在此处被调用两次。对我来说似乎毫无意义。我希望至少为向导编写代码的人都能理解这应该是如何工作的。

1 个答案:

答案 0 :(得分:1)

这里有两种不同的方法,它们具有相似的名称。

tableView:cellForRowAtIndexPath:是您实现的UITableViewDataSource方法,用于创建要显示的表格的单元格。当一个新单元格出现在屏幕上时,tableview会调用此方法。

controller:didChange:...正在调用名为cellForRowAtIndexPath:的另一种方法,即UITableView方法。此方法在表中查询先前使用tableView:cellForRowAtIndexPath:数据源方法创建之后已显示的单元格,并且不会再次调用它。它调用此方法来访问已经显示的单元格,并在对象更改时使用新信息更新它。

两次调用configureCell都是必要的。