2017-01-24 36 views
0

由XCode向导创建的主 - 明细项目包含tableView:cellForRowAtIndexPath:的实现,该实现调用dequeueReusableCellWithIdentifier:forIndexPath:,然后调用自定义方法configureCell以用有效数据填充单元格控件,然后将单元格返回给调用者。据我所知,这是如何表知道如何绘制其单元格内容。tableView:cellForRowAtIndexPath:应该如何使用?

我不明白的是如何使用它,当我想从我的代码中获取单元格。它甚至应该被我的代码调用,还是它只是表框架本身使用的回调?例如,如果我只想更改单元格中一个标签的文本,我认为我可以调用tableView:cellForRowAtIndexPath:,并在生成的单元格对象控件中更改我需要的内容。但调用tableView:cellForRowAtIndexPath:实际上会生成一个新的单元对象(可能会重用未使用的单元对象池中的一个),并使用数据填充所有控件,如图像浏览和标签。当我想要更改一个标签时,这对我的表现并不好。

因此,也许我可以从tableView:cellForRowAtIndexPath:中删除configureCell?但是,如果调用[table reloadData]时如何确保所有单元格内容将被系统重新绘制?

P.S. 的XCode 7向导创建这种代码:

- (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; 

configureCell被称为这里的两倍。对我来说似乎是无意义的。我希望至少有人为代码编写巫师知道这应该如何工作。

+0

此调用仅由表框架使用。你可以调用reloadRowsAtIndexPaths并只发送一行来更新一个特定的行。 –

回答

1

这里有两种不同的方法在这里被称为具有相似的名称。

tableView:cellForRowAtIndexPath:是一个UITableViewDataSource方法,您可以通过它来创建要显示的表格的单元格。当一个新的单元出现在屏幕上时,tableview调用这个方法。

controller:didChange:...正在调用不同的方法,称为cellForRowAtIndexPath:这是一个UITableView方法。此方法将查询表格,以查找之前使用tableView:cellForRowAtIndexPath:数据源方法创建之后已显示的单元格,并且不会再次调用它。它调用此方法访问已显示的单元格,并在对象更改时用新信息更新它。

两个电话configureCell是必要的。

+0

我的不好,方法名称太相似了,我没有看到他们实际上不同。现在它是有道理的。谢谢。 – jesse

+0

但是为什么这两个调用configureCell都是必要的?第二个人是不是会覆盖第一个人所做的一切? – jesse

+0

第二个仅在对象发生更改时调用,因此您希望使用更新对象中的数据覆盖单元中当前的数据。 – dan

相关问题