在reloadRowsAtIndexPaths之后不调用cellForRowAtIndexPath

时间:2013-07-03 03:54:09

标签: iphone ios objective-c uitableview core-data

正如Apple Doc所说,

  

重新加载行会导致表视图向其数据源询问新内容   该行的单元格。

我将UITableView与NSFetchedResultsController结合使用:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    if (self.tableView.isEditing) 
    {
        [self.tableView setEditing:NO animated:YES];
    }
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];

    [self updateTabItemBadge];
    [self.noDataView setHidden:![self isNoData]];

    WXINFO(@"controllerDidChangeContent");
}

在上述两个函数之间,我重新加载目标单元格:

enter image description here

    case NSFetchedResultsChangeUpdate: {
        if (indexPath) {
            [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
        }

enter image description here

我在第1563行设置断点,检查是否已调用reloadRowsAtIndexPaths,但在此之后,- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath未被调用。

所以,我的手机无法更新。

有人可以告诉我为什么?感谢。

4 个答案:

答案 0 :(得分:1)

包装:

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];

答案 1 :(得分:0)

请您使用[tableView reloadData]重新加载tableview进行检查吗?

如果只想更新一行而不重新加载表,请检查'indexPath'类型。它应该是NSIndexPath。

答案 2 :(得分:0)

我发现这样做的唯一可靠方法是使用除非之外的动画。如果指定了任何其他动画,则重新加载正确。

答案 3 :(得分:0)

这是我做过的一项工作,但它完成了这项工作。

 func tableView(_ tableView: UITableView, commit editingStyle:
    UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCellEditingStyle.delete {
            if itemDetailDict.count - 1 <= 0 {
                self.mainTable.beginUpdates()
                let cellOne = self.mainTable.cellForRow(at: indexPath)
                cellOne?.textLabel?.text = "There are no items."
                self.mainTable.reloadRows(at: [indexPath], with: .automatic)
                self.mainTable.endUpdates()
            } else {
                self.mainTable.beginUpdates()
                let removeKey = Array(itemDetailDict.keys)[indexPath.row]
                itemDetailDict.removeValue(forKey: removeKey)
                mainTable.deleteRows(at: [indexPath], with: .automatic)
                self.mainTable.endUpdates()
            }
        }
    }

基本上在删除行功能上我希望用户能够删除该行,但是当只剩下一行时,我想在tableview的单元格中显示默认消息。

为此,我更新了数据源,当字典中没有更多数据时,我更新了单元格以显示文本,重新加载单元格,然后在我的tableview上调用endUpdating。

我希望这会有所帮助。