Ios UITableView';s重新加载RowsatindExpaths:似乎中断insertRowsAtIndexPaths:

Ios UITableView';s重新加载RowsatindExpaths:似乎中断insertRowsAtIndexPaths:,ios,uitableview,uikit,Ios,Uitableview,Uikit,我有一个UITableView,用户可以在其中插入新行。发生这种情况时,我希望重新加载表中的所有旧行。一种解决方案是在插入发生时立即调用reloadData,这完全有效,但这意味着我无法获得插入动画 因此,当用户点击“添加行”按钮时,我会调用reloadRowsAtIndexPaths:,除了刚才插入的索引路径之外,其他所有索引路径都会被调用。然后我只使用新插入的行调用insertRowsAtIndexPaths:。合理,对吧 这会导致应用程序崩溃,原因如下: 无效更新:节0中的行数无效。更新后

我有一个
UITableView
,用户可以在其中插入新行。发生这种情况时,我希望重新加载表中的所有旧行。一种解决方案是在插入发生时立即调用
reloadData
,这完全有效,但这意味着我无法获得插入动画

因此,当用户点击“添加行”按钮时,我会调用
reloadRowsAtIndexPaths:
,除了刚才插入的索引路径之外,其他所有索引路径都会被调用。然后我只使用新插入的行调用
insertRowsAtIndexPaths:
。合理,对吧

这会导致应用程序崩溃,原因如下:

无效更新:节0中的行数无效。更新后现有节中包含的行数(1)必须等于更新前该节中包含的行数(0),加上或减去从该节插入或删除的行数(0插入,0删除),加上或减去移入或移出该节的行数(0移入,0移出)

正如您在本例中看到的,即使当
reloadRowsAtIndexPaths
被传递一个索引路径的空数组时,也会发生这种情况

啊!!我需要用
beginUpdates
endUpdates
来包装这两个调用。很公平。但是现在动画完全被破坏了

我正在使用
UITableViewRowAnimationFade
执行重新加载,并使用
UITableViewRowAnimationAutomatic
执行插入。但是在动画中,每一行的高度都会发生变化,产生了这种奇怪的闪烁效果,看起来非常糟糕。设置这些更改动画的正确方法是什么

编辑: 从
重新加载rowsatindexpaths:withrowsanimation:
的文档中:

重新加载行会导致表视图向其数据源请求该行的新单元格。表格在设置旧行的动画时设置新单元格的动画。如果要提醒用户单元格的值正在更改,请调用此方法。但是,如果通知用户并不重要,也就是说,您只需要更改单元格显示的值,就可以获取特定行的单元格并设置其新值


我认为,在我的应用程序中,手动更新每个单元格是正确的方法。然而,我仍然对这个奇怪的动画错误感到不安,我想知道它的原因是什么/如果我“想提醒用户单元格的值正在改变”,我会怎么做。

您不需要对单元格进行任何操作。您所需要的只是更改数据源数组,然后调用reload data/row/section,您将在表视图中获得更改的数据,并添加行。

出现此错误的常见原因是,正如文档所说,数据源需要一个单元格。可能不太清楚的是,它被要求两次……一次是提供初始数据,另一次是提供最终数据。这意味着tableView:numberOfRowsInSection:方法必须在BeginUpdate之前返回旧值,在EndUpdate之后返回新值(或者如果使用的是快捷方式方法,则在调用之前和之后)。如果相关,也不要忘记numberOfSectionsInTableView

例如:

    numberOfRows... return [array count];

    // Incorrect
    [array addObject:object];
    [tableView beginUpdates];
    [tableView insertRow..];
    [tableView endUpdates];

    // Correct
    [tableView beginUpdates];
    [array addObject:object];
    [tableView insertRow..];
    [tableView endUpdates];

对于您的具体情况,我建议您先进行插入,然后在整个tableview上调用reloadData,只要这样不会弄乱您的动画或其他任何内容。

为什么需要重新加载现有的行,您不能只使用insertRows。。。陈述现有行是否更改了其值?是的,当添加新行时,所有其他行中显示的值都会更改。否则我就不会重新加载它们了。至于高度的问题——你的单元格的高度是不同的,还是与表中指定的值不同?所有的单元格都是相同的高度,而且高度永远不会改变,所以我对为什么要设置高度动画感到困惑。这就像不是增加最后一行的大小(就像正常的插入动画那样),而是整个部分的高度在改变,每一行都按比例缩放。很难描述,我想。你可以尝试插入带有动画的行,然后在0.5秒延迟后重新加载(没有动画)?看起来像是一个黑客,当然,这很容易,但不允许动画的变化。为什么?oO'[tableView重新加载RowsatindExpaths:[NSArray arrayWithObject:indexPath]带RowAnimation:UITableViewRowAnimationFade];'再次检查问题——我正在执行插入操作,而不仅仅是调用
reloadRows
。我找不到;]为什么你需要实际插入物理行,什么会崩溃,对更新数据源,并通过动画显示插入行?我不理解你的评论。我插入行是因为应用程序需要这样做。它将行添加到表中,然后重新加载所有其他行。问题是“为什么会崩溃?”将addObject:call放入BeginUpdate/endUpdates“块”中非常有意义。在我的例子中,如果我不这样做,它会随机崩溃。