删除并在tableView中插入单元格

时间:2014-08-11 17:11:37

标签: ios objective-c uitableview nsindexpath

我对indexPath中的TableView个单元格存在问题。

例如,我填充TableView,其数据源为5个对象[cell0 cell1 cell2 cell3 cell4 cell5]。对于每个单元格,indexPath似乎是好的:cell0具有indexPath 0,单元格1具有indexPath 1等。

然后,我单击cell0以便在cell0之后使用方法didSelectRowAtIndexPath添加一个cell6,所以现在,我的数据源类似于[cell0 cell6 cell1 cell2 cell3 cell4 cell5]和{{1}每个单元格似乎又好了:cell0有indexPath 0,单元格6有indexPath 1,单元格1有indexPath 2等等。

所以,现在,我想删除cell6,并在cell2之后插入一个cell7,以获得以下数组[cell0 cell1 cell2 cell7 cell3 cell4 cell5]。单击cell2时应该执行此操作。因此,要执行此操作,indexPath会调用2种方法:TableViewdidSelectRowAtIndexPath

因此,当我点击cell2时,方法didDeselectRowAtIndexPathdidDeselectRowAtIndexPath 0调用。这看起来很好,因为之前选择的单元格是cell0。在此方法中,我使用方法indexPath删除cell6。所以现在我的数据源看起来像下面的数组:[cell0 cell1 cell2 cell3 cell3 cell4 cell5]但是deleteRowsAtIndexPaths似乎很好:cell0有indexPath 0,cell1有indexPath等等。

最后,要添加cell7,方法indexPath将使用didSelectRowAtIndexPath 3而不是2来调用。因此,结果是新单元格未插入到正确的位置... dataSource看起来像[cell0 cell1 cell2 cell3 cell7 cell7 cell4 cell5]而不是[cell0 cell1 cell2 cell7 cell3 cell4 cell4]。

有没有办法强制刷新indexPath?也许我不使用好的方法?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

很难准确理解你要问的是什么,但你可以用以下内容重新加载特定的indexPath。

[self.tableView reloadRowsAtIndexPaths:indexPatshArray withAnimation:UITableViewAnimationFade];

答案 1 :(得分:0)

你的问题和方法确实让我感到困惑。

我建议不要以这种方式修补和强迫订单。

更新您的数据模型,但在NSArray中插入新数据。 像这样:

NSArray *data = [NSArray arrayWithObjects: @"1", @"2", nil];

当用户选择并进行更改时,在数组中插入元素

[data insertObject:@"3" AtIndex:whatever];

此时你想重新加载你的桌面视图,所以从正确的地方调用

[mytableview reloadData];

同样适用于您的删除操作。更新数据模型并调用reloadData。让tableview绘制基于你的cellForRowAtIndex方法

答案 2 :(得分:0)

感谢您的回复。

首先,我点击一个单元格添加一个新单元格。 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 0调用方法IndexPath(没关系)。 方法didSelectRowAtIndexPath' is called with IndexPath`之后。

新单元格被添加到错误的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时,方法didselectRowAtIndexPath更改数据源(删除单元格“Test”)。调用方法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];
}