好,直到几天前,我一直在使用UITableViewCell编写所有代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

方法。但是最近我发现iPhone开发人员(或mac)使用configureCell:atIndexPath:甚至提供源代码的大多数苹果都将此作为类函数之一。 因此,我的问题基本上是为什么我们要创建另一个函数来提供单元格内容,然后仅将整个代码编写为cellForRowAtIndexPath:方法。

PS。对于不熟悉此方法的人,您应该看到apples源代码。 configureCell:atIndexPath:并不是UITableViewDatasource中的另一个方法,它只是我们在每个具有表view的类中具有的类函数。我们这样使用它。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:CellIdentifier] autorelease];
    }
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
     cell.titleLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];
}

更重要的是,仅将这种样式用于试用目的之后,我就爱上了这个功能,现在我一直都在使用它(当我使用UITableView时)

编辑:好的,我认为人们对我的问题有一个错误的认识,所以让我把它弄清楚。

我的意思是为什么当您可以将所有代码放入此功能时创建另一个功能
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

我不关心方法名称。

最佳答案

这样做是因为您可能想要在屏幕上已经存在的单元格进行更新。您不必完全刷新单元格,而只需从表 View 中获取现有单元格并通过configureCell:atIndexPath:运行它即可。如果正确实现了该方法,这将更新单元格中的所有数据,而无需让UITableView删除旧单元格,出队或分配新单元格并将其显示在屏幕上。

对于历史兴趣:

据我所知,我是负责configureCell:atIndexPath:的人。我敢肯定其他人也有同样的想法,但是我相信普及它的代码片段最初是由我编写的。然后由Apple传播,并成为惯例。

早期版本的NSFetchedResultsControllerDelegate具有controllerDidChangeContent:方法,但是没有controllerWillChangeContent:调用,这意味着在更改表 View 的内容之前没有机会调用-[UITableView beginUpdates]

我提交了Radar#6708453,要求他们添加此委托(delegate)方法,并提供了一些示例代码来向他们展示我想要做什么。该代码在refreshCell:atIndexPath:调用中具有实际的单元更新逻辑,因此可以从tableView:cellForRowAtIndexPath:controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:中调用它。

当下一个beta种子问世时,我发现iOS工程团队不仅添加了我建议的方法,而且将错误报告中的示例代码复制到NSFetchedResultsControllerDelegate documentation中,尽管他们明智地将名称更改为不太困惑的configureCell:atIndexPath:

实际上,我今天使用Master / Detail iOS Core Data模板开始了一个新项目,并注意到模板中包含我的代码以及configureCell:atIndexPath:方法。我运行了一个快速的Google搜索,看看它是否已经成为一种惯例。好像有。我为那小部分的代码本身感到骄傲!

关于iphone - 程序员为什么要使用configureCell:atIndexPath:方法来配置tableView Cell,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5467831/

10-12 05:11