使用 insertRowsAtIndexPaths 时的表视图单元格索引
Posted
技术标签:
【中文标题】使用 insertRowsAtIndexPaths 时的表视图单元格索引【英文标题】:Table view cell indexing when using insertRowsAtIndexPaths 【发布时间】:2011-11-23 01:07:14 【问题描述】:好吧,我卡住了。这是我之前的一篇文章的延伸。这就是我想要做的。
我在导航栏上有一个编辑按钮,按下该按钮时会在我的一个部分表视图的开头添加一个单元格。此单元格的用途是否允许使用向表中添加新数据;因此它的编辑风格是插入。表格中剩余的单元格配置为删除编辑样式。
这是我的setediting方法:
- (IBAction) setEditing:(BOOL)isEditing animated:(BOOL)isAnimated
[super setEditing:isEditing animated:isAnimated];
// We have to pass this to tableView to put it into editing mode.
[self.tableView setEditing:isEditing animated:isAnimated];
// When editing is begun, we are adding and "add..." cell at row 0.
// When editing is complete, we need to remove the "add..." cell at row 0.
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
NSArray* path = [NSArray arrayWithObject:indexPath];
// fill paths of insertion rows here
[self.tableView beginUpdates];
if( isEditing )
[self.tableView insertRowsAtIndexPaths:path withRowAnimation:UITableViewRowAnimationBottom];
else
[self.tableView deleteRowsAtIndexPaths:path withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView endUpdates];
// We nee to reload the table so that the existing table items will be properly
// indexed with the addition/removal of the the "add..." cell
[self.tableView reloadData];
我在我的代码中考虑了这个额外的单元格,除了我现在有两个索引路径 = [0,0] - 新单元格和表中旧的原始第一个单元格。如果我在 setEditing 中添加一个重新加载表格视图单元格的调用,单元格会被重新索引,但现在我的表格视图不再是动画。
我想要我的蛋糕,也吃掉它。还有其他方法可以完成我想做的事情并保持动画吗?
--约翰
【问题讨论】:
我已经看到了示例代码,除了在表格末尾添加了新单元格之外。不是我想要的 - 我想要它在表格的开头。 不清楚问题是什么以及您要完成什么。 以通讯录为例。当您编辑联系人时,会在“地址”部分的末尾添加带有“+”编辑样式的单元格“添加新地址”。我想做类似的事情,除了我想要在本节开头的新单元格。我可以通过在 indexPath [0,0] 处插入单元格来轻松完成此操作。但这给了我两个位于 [0,0] 的单元格(新单元格和 [0,0] 处的原始单元格)。我可以通过重新加载表格(重新索引单元格)来解决这个问题,除非我这样做时按下编辑按钮时表格不再动画。 我很好奇您使用的是什么类型的数据源?是数组还是fetchedresultcontroller,还是别的什么? 数据源只是一个数据对,就像标题和副标题一样。我只是使用地址簿作为我想要对单元格执行的操作的示例。 【参考方案1】:您可以做任何您想做的事,但您需要保持您的数据源与表格一致。换句话说,当重新加载表格时,tableView:cellForRowAtIndexPath
和其他负责构建表格的 UITableViewDataSource
和 UITableViewDelegate
方法应根据您在 setEditing:antimated:
中添加/删除的编辑状态返回相同的单元格。
因此,当您在setEditing:animated:
中插入/删除单元格时,您还需要确保您的数据源反映了相同的更改。如果您要在节的开头添加一个特殊单元格但其余数据来自数组,这可能会很棘手。一种方法是在重新加载表格时,如果进行编辑,则将第 0 行设为添加单元格,并将第 1 行用作后续单元格的数组索引。如果您这样做,您还需要在tableView:numberOfRowsInSection:
中添加一个以说明额外的单元格。
另一种方法是为添加单元格设置一个部分,不编辑时它将有 0 行,否则为 1 行,然后您返回相应的单元格。这还需要您根据您希望的外观来适当地配置表格和单元格。
【讨论】:
我正在使用“-1”技巧。我编辑了我的原始帖子以显示带有 reloadData 的 setEditing 代码。如果我不重新加载数据,那么我有两个单元格 @ [0,0];但是在编辑开始/结束时重新加载数据会“杀死”我的动画。 您不需要重新加载整个表格。您只需要插入/删除受影响的部分/行。如果您的数据源也反映了更改,则会自动保留表的完整性。你也不需要'beginUpdates/endUpdates',尽管它不会伤害任何东西。仅在进行要一次制作动画的多项更改时才这样做。您只进行了一次更改。以上是关于使用 insertRowsAtIndexPaths 时的表视图单元格索引的主要内容,如果未能解决你的问题,请参考以下文章
控制 uitableview insertRowsAtIndexPath 动画的速度
带有 2 个动画的 insertRowsAtIndexPaths
insertRowsAtIndexPaths 为每一行调用 cellForRowAtIndexPath
insertRowsAtIndexPaths 自定义动画 Swift