iPhone:使用insertRowsAtIndexPaths划分UITableView渲染故障

时间:2009-08-27 10:33:31

标签: iphone uitableview

我希望你能提供帮助,因为我有点担心在哪里寻找解决我遇到的UITableView问题的解决方案:

当我使用以下方法在UITableView部分的顶部插入一个新项目时(请参阅下面的代码),除了这个小故障外,它们都能很好地工作:该部分顶部的插入行按预期呈现 - 带有圆角在左上角和右上角。麻烦的是下面的行没有在视觉上更新,即第二行/单元格仍然有圆角,而现在它应该在它的顶角 - please see this screen grab for clarification之后平方,在动画之后插入一个新行的顶部第二部分已经发生。查看单元格的角落,因为它们尚未更新。

// Amend the data source before updating the view to reflect the changes
[[self.playerData objectAtIndex: 0] removeObjectAtIndex: row];
[[self.playerData objectAtIndex: 1] insertObject:playerName atIndex:0];

// Amend the view to reflect changes
NSArray *deleteIndexPaths = [NSArray arrayWithObjects:
    [NSIndexPath indexPathForRow:row inSection:0],
    nil];

NSArray *insertIndexPaths = [NSArray arrayWithObjects:
    [NSIndexPath indexPathForRow:0 inSection:1],
    nil];

[self.playerTableView beginUpdates];
[self.playerTableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation: UITableViewRowAnimationLeft];
[self.playerTableView deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation: UITableViewRowAnimationLeft];
[self.playerTableView endUpdates];

当然如果我刚发送消息:[self.playerTableView reloadData];视图会正确显示。但是,我们确实需要动画这个程序来提供光滑的体验。也许如果在插入动画完成时触发了委托事件,我可以从数据源更新视图以消除故障,但我没有发现任何这样的钩子。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

找到了答案。它可能不是最有效的,尽管在我们的情况下会很好,因为我们只处理一些细胞。我通过刷新未明确重绘的其他单元格来修复它:

// Fix for cells not rendered correctly after insertion of top cell]
[self.playerTableView reloadRowsAtIndexPaths:reloadIndexPaths withRowAnimation: UITableViewRowAnimationNone];

我可能只是期待过多的UITableView:它会在执行insertRowsAtIndexPaths时为我排序。

FYI info此代码放在beginUpdates-endUpdates块之后。其他任何事情似乎都会导致崩溃,尽管没有调查过。

感谢。

答案 1 :(得分:0)

Better option is we reload visible rows and then insert new rows.

self.tableView.beginUpdates()
self.tableView.reloadRowsAtIndexPaths(self.tableView.indexPathsForVisibleRows!, withRowAnimation: UITableViewRowAnimation.Fade)
self.tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.Fade)
self.tableView.endUpdates()