调用cellForRowAtIndexPath:是否实用?

时间:2013-12-11 04:05:11

标签: ios uitableview

在实施UITableViewDelegateUITableViewDataSource直接调用cellForRowAtIndexPath:时,我见过很多许多开发人员:

1)检索单元格以获取它们存储在其中的模型元素     细胞:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    MyCell *cell = (MyCell *)[tableView cellForRowAtIndexPath:indexPath];
    int secretCode = cell.secretCode;
    LaunchMissileViewController *vc = [[LaunchMissileViewController alloc] initWithSecretCode:secretCode];
    [self.navigationController pushViewController:vc];
}

2)尝试设置单元格的样式(这有明显的问题,但似乎很常见):

MyCell *cell = (MyCell *)[self cellForRowAtIndexPath:indexPath];
// or [tableView cellForRowAtIndexPat:indexPath];
cell.backgroundColor = [UIColor greenColor];

是否可以安全地声明“只有框架永远调用cellForRowAtIndexPath:”?或者是否有一个人可能自己称之为的实际原因?

3 个答案:

答案 0 :(得分:8)

就我个人而言,我认为直接在数据源上直接调用tableView:cellForRowAtIndexPath:并不是一个好例子。

对于案例#1,它只是编码错误。单元格永远不应包含数据。数据源应该具有数据,因此从实际数据源获取数据,而不是单元格。

对于案例#2,您只需要更新可见单元格。为此,您可以使用UITableView cellForRowAtIndexPath:方法。无需调用单元格的数据源。

我尝试永远不要说“从不”,但它应该是一个非常罕见的情况,你真的需要通过调用数据源方法来获取单元格。

答案 1 :(得分:3)

我会说rmaddy是正确的,虽然我有一个案例,可以说实用:

如果您需要将UITableViewCell的副本应用于其他视图。

(源自https://github.com/Ice3SteveFortune/i3-dragndrop

UIView* cellCopy;

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
NSData* viewCopyData = [NSKeyedArchiver archivedDataWithRootObject:cell];
cellCopy = [NSKeyedUnarchiver unarchiveObjectWithData:viewCopyData];

// Maybe to drag-and-drop outside of the UITableViewCell.
[self.otherView addSubview:cellCopy];  

我想在此留下这个作为 少数之一的示例,其中调用cellForRowAtIndexPath是远程可行的:

答案 2 :(得分:1)

从单元格中检索数据毫无意义,因为开发人员会知道插入到单元格中的数据。开发人员可以直接获取数据。使用这种方法的另一个问题(大问题)是,如果该单元格不可见,则首先生成该单元格,然后检索数据。