【问题标题】:moveRowAtIndexPath doesn't refresh the cell's contentmoveRowAtIndexPath 不刷新单元格的内容
【发布时间】:2011-12-13 06:50:52
【问题描述】:

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

我也不能调用 reloadRowsAtIndexPaths:,因为我不允许在同一 beginUpdates-endUpdates 块内的单行上应用 2 个动画。

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

【问题讨论】:

  • 不确定,但请尝试查看beginUpdatesendUpdates。您也许可以跟踪正在移动的 indexPath,并在 endUpdates 中对单元格进行适当的更改(如果已移动)。
  • 在 endUpdates 之后调用任何新的行动画函数会取消该单元格的待处理动画。换句话说,单元格确实被重绘了,但移动动画不再发生。调用setNeedsDisplay 也有类似的效果。
  • 提交了一个错误报告:openradar.appspot.com/10457435

标签: iphone uitableview ios5


【解决方案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 中的使用相比具有不同的参数,因此在复制粘贴时要小心。要做到这一点相当棘手。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      相关资源
      最近更新 更多