在 tableView 中删除和插入单元格
Posted
技术标签:
【中文标题】在 tableView 中删除和插入单元格【英文标题】:Delete and insert cells in a tableView 【发布时间】:2014-08-11 17:11:37 【问题描述】:我对@987654322@ 中的单元格indexPath
有疑问。
例如,我用 5 个对象 [cell0 cell1 cell2 cell3 cell4 cell5] 的数据源填充了 TableView
。对于每个单元格,indexPath
似乎很好:单元格 0 有 indexPath
0,单元格 1 有 indexPath
1,等等。
然后,我单击 cell0 以便使用 didSelectRowAtIndexPath
方法在 cell0 之后添加一个 cell6 所以现在,我的数据源类似于 [cell0 cell6 cell1 cell2 cell3 cell4 cell5] 和每个单元格的 indexPath
似乎又好了:单元格 0 有 indexPath
0,单元格 6 有 indexPath
1,单元格 1 有 indexPath
2,等等。
所以,现在,我想删除 cell6,并在 cell2 之后插入一个 cell7,以得到以下数组 [cell0 cell1 cell2 cell7 cell3 cell4 cell5]。当我单击 cell2 时,应该会发生此操作。因此,为此,TableView
调用了 2 个方法:didSelectRowAtIndexPath
和 didDeselectRowAtIndexPath
。
所以,当我单击单元格2 时,方法didDeselectRowAtIndexPath
被调用indexPath
0。这似乎很好,因为之前选择的单元格是单元格0。在这个方法中,我使用方法deleteRowsAtIndexPaths
删除了cell6。所以现在我的数据源看起来像下面的数组:[cell0 cell1 cell2 cell3 cell4 cell5] 但indexPath
似乎很好:cell0 有indexPath
0,cell1 有indexPath
1,等等。
最后,添加cell7,调用didSelectRowAtIndexPath
方法indexPath
3而不是2。所以结果是新的单元格没有插入到好地方...... dataSource看起来像[ cell0 cell1 cell2 cell3 cell7 cell4 cell5]而不是[cell0 cell1 cell2 cell7 cell3 cell4 cell5]。
有没有办法强制刷新 indexPath
?也许我没有使用好的方法?
提前感谢您的帮助!
【问题讨论】:
嗨@Staroun 如果您分享代码的相关部分,获得帮助会更容易,您的问题可能会更有吸引力。 请贴出代码,它负责大部分的解释:) 这对你有用吗? @staroun 我发布了我的代码并捕获了。 【参考方案1】:很难准确理解您要问的是什么,但您可以使用以下内容重新加载特定的 indexPath。
[self.tableView reloadRowsAtIndexPaths:indexPatshArray withAnimation:UITableViewAnimationFade];
【讨论】:
【参考方案2】:您的问题和方法确实让我感到困惑。
我建议不要以这种方式修改和强制命令。
更新您的数据模型,但在您的 NSArray 中插入新数据。 像这样的:
NSArray *data = [NSArray arrayWithObjects: @"1", @"2", nil];
当用户选择并进行更改时,在您的数组中插入元素
[data insertObject:@"3" AtIndex:whatever];
此时你想重新加载你的表格视图,所以从正确的地方调用
[mytableview reloadData];
同样适用于您的删除操作。更新数据模型并调用 reloadData。让 tableview 绘制是基于你的 cellForRowAtIndex 方法
【讨论】:
【参考方案3】:感谢您的回复。
首先,我单击一个单元格以添加一个新单元格。 IndexPath
为 0。(没关系)。
方法didSelectRowAtIndexPath
被调用
其次,我点击了一个带有IndexPath
2 的单元格。
https://www.dropbox.com/s/777kuo88ra0v6jk/Capture%20d%E2%80%99%C3%A9cran%20du%20Simulateur%20ios%2012%20ao%C3%BBt%202014%2009.30.23.png
方法didDeselectRowAtIndexPath
调用IndexPath
0(没关系)。
在方法didSelectRowAtIndexPath' is called with
IndexPath` 2 之后。
新单元格添加到错误的IndexPath
。
https://www.dropbox.com/s/j02gjfx4bci4rs5/Capture%20d%E2%80%99%C3%A9cran%20du%20Simulateur%20iOS%2012%20ao%C3%BBt%202014%2009.30.30.png
当我单击IndexPath
2. 方法didselectRowAtIndexPath
更改数据源(单元格“测试”被删除)。当方法 didSelectRowAtIndexPath
被调用时。 IndexPath
始终为 2,但使用新数据源(由方法 didselectRowAtIndexPath
更改)IndexPath
应为 1,以便在好单元格下方添加新单元格。
indexPath 没有更新。我必须更新自己吗?还是 tableView ?
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
[_dashboardDataSource removeObjectAtIndex:indexPath.row + 1];
[tableView beginUpdates];
NSArray *deleteIndexPaths = [NSArray arrayWithObjects:
[NSIndexPath indexPathForRow:indexPath.row + 1 inSection:indexPath.section],
nil];
[tableView deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationMiddle];
[tableView endUpdates];
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
DetailItemData *itemData = [[DetailItemData alloc] init];
dropItemData.title = @"TEst";
[_dashboardDataSource insertObject:itemData atIndex:indexPath.row + 1];
[tableView beginUpdates];
NSArray *insertIndexPaths = [NSArray arrayWithObjects:
[NSIndexPath indexPathForRow:indexPath.row + 1 inSection:indexPath.section],
nil];
[tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationMiddle];
[tableView endUpdates];
【讨论】:
以上是关于在 tableView 中删除和插入单元格的主要内容,如果未能解决你的问题,请参考以下文章
尝试快速从数组中删除时,不应删除 tableview 单元格中的最后一个单元格
如何通过单击单元格中的按钮来删除 tableView 中的单元格?使用核心数据
如何从 tableview 的单元格中删除 imageView,并重置单元格的高度
即使在删除某些单元格后,仍以与 TableView 单元格相同的顺序将文本字段值保存在数组中
如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图