UITableViewController tableView:cellForRowAtIndexPath返回错误的行

时间:2014-06-13 22:26:09

标签: ios objective-c uitableview

在我的控制器类中,我实现了表视图数据源委托方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    NSLog(@"In cell for row at index path %i ", indexPath.row);
    // a bunch of other typical stuff
}

按下按钮,我想修改某个单元格。要获得参考,我这样做:

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

我确实得到了对单元格的引用,但我的日志方法并没有执行。就像UITableViewController.tableView有不同的委托一样?当我这样做时:

UITableViewCell *cell = [self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

它返回一个不同的行(它看起来像一个标题?)。这里有一些NSLog来显示正在发生的事情

       NSLog(@"About to send message to tableView:cellForRowAtIndexPath:indexPathForRow:inSection");
        MCSwipeTableViewCell *cell = (MCSwipeTableViewCell *) [self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
        MCSwipeTableViewCell *theOtherCell = (MCSwipeTableViewCell *) [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

        NSLog(@"Here is the call on self %@", cell);
        NSLog(@"Here is the delegate cell %@", theOtherCell);
        NSLog(@"Here is my reference %@", self);
        NSLog(@"Here is the table view delegate %@", self.tableView.delegate);

和输出:

2014-06-13 15:20:41.601 krow[28823:70b] Here is the call on self <MCSwipeTableViewCell: 0xa3eda00; baseClass = UITableViewCell; frame = (0 0; 320 44); gestureRecognizers = <NSArray: 0x8d82dc0>; layer = <CALayer: 0x8d82de0>>
2014-06-13 15:20:41.601 krow[28823:70b] Here is the delegate cell <MCSwipeTableViewCell: 0xc43fa00; baseClass = UITableViewCell; frame = (0 0; 320 220); autoresize = W; gestureRecognizers = <NSArray: 0xa8be640>; animations = { position=<CABasicAnimation: 0x8d79040>; }; layer = <CALayer: 0xa87d070>>
2014-06-13 15:20:41.601 krow[28823:70b] Here is my reference <KrowInboxTableViewController: 0x8c779c0>
2014-06-13 15:20:41.601 krow[28823:70b] Here is the table view delegate <KrowInboxTableViewController: 0x8c779c0>

为什么我为cellForRowAtIndexPath获取不同的行?

1 个答案:

答案 0 :(得分:5)

对于初学者,您有意调用的cellForRowAtIndexPath:方法不会调用委托来创建新单元格。与实际创建或出列单元格并将其返回到tableview的委托方法tableView:cellForRowAtIndexPath:不同,cellForRowAtIndexPath:方法只是为了提供对现有单元格的引用。文档在返回值的描述中对此进行了备份:

An object representing a cell of the table or nil if the cell is not visible or indexPath is out of range.

同样,tableview自己调用的委托方法是创建一个单元格,而你调用的方法就是抓取现有的可见单元格而不创建或出列任何东西。

至于下一位,问题是您正在调用tableview应该调用的方法,该方法将创建或出列新单元而不是返回已经可见的单元。你永远不应该手动调用这个方法。您使用cellForRowAtIndexPath:的第一种方法是获取现有可见单元格的正确方法。除此之外,您还需要提供更多信息,了解如果这不能解决您的问题,那么您真正想要实现的目标。