moveRowAtIndexPath不刷新单元格的内容

时间:2011-10-22 18:26:05

标签: iphone uitableview ios5

iOS 5最终向moveRowAtIndexPath:toIndexPath:添加了UITableView方法。问题是,调用它只会移动行,它不会更新/重绘它。这样做的唯一方法似乎是找到单元格并直接调用setNeedsDisplay。但这很棘手,因为你永远都不知道细胞是否已经被移动了。

我也无法致电reloadRowsAtIndexPaths:,因为我不允许将2个动画应用于同一beginUpdates-endUpdates块内的单个行。

我可以想到一些可行的解决方法,比如将整个事物分成2个动画块。但是我想知道我是否遗漏了一些东西,因为整个行为对我来说似乎很奇怪。

2 个答案:

答案 0 :(得分:14)

最后收到Apple关于此问题的正式回答:

  

Engineering已确定此问题的行为符合预期   关于以下信息:

     

仅插入和更新会导致从数据中请求单元格   来源(第一个因为它是新的,第二个是因为你   明确告诉表视图更新单元格)。删除并移动   不要更新内容,因为这不是动作中隐含的内容   被执行。如果需要更改单元格的内容   在更新期间,只需进入单元格并更改内容。

答案 1 :(得分:2)

他们喜欢让我们很难不这样做; - )

    case NSFetchedResultsChangeUpdate:
        [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;

    case NSFetchedResultsChangeMove:
        // old API
        //[tableView  deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        //[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

        // new API
        [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:newIndexPath]; // note use of newIndexPath
        [tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; // NS_AVAILABLE_IOS(5_0);
        break;

注意在ChangeMove中,configureCell与在ChangeUpdate中的使用相比具有不同的参数,因此在复制粘贴时要小心。为了做到这一点非常棘手。