在 tableView 中删除和插入单元格

Posted

技术标签:

【中文标题】在 tableView 中删除和插入单元格【英文标题】:Delete and insert cells in a tableView 【发布时间】:2014-08-11 17:11:37 【问题描述】:

我对@9​​87654322@ 中的单元格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 个方法:didSelectRowAtIndexPathdidDeselectRowAtIndexPath

所以,当我单击单元格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 withIndexPath` 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 中的单元格?使用核心数据

如何从 tableview 的单元格中删除 imageView,并重置单元格的高度

即使在删除某些单元格后,仍以与 TableView 单元格相同的顺序将文本字段值保存在数组中

如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图