使用deleteRowsAtIndexPaths后indexPath未更新

时间:2012-11-12 15:15:00

标签: objective-c uitableview

当用户想删除一个单元格时,我创建了一个更新我的UITableView的方法。

-(void)removeMoreFriendsRow:(NSNotification *)notification {
NSDictionary *d = [notification userInfo];
NSIndexPath *index = [d objectForKey:@"indexPath"];

[self.p_currentFriends removeObjectAtIndex:index.row];

[self.o_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:index] withRowAnimation:UITableViewRowAnimationRight];
}

p_currentFriends是一个NSMutableArray,它包含UITableView打印的所有对象。

当我使用它一次时,此方法可以正常工作,但是当我多次使用它时它会失败。

在每次调用deleteRowsAtIndexPaths时,indexPath似乎保持不变。

例如, - 在第一次调用时,用户点击第二个单元格,indexPath = [0,1]并删除正确的单元格, - 在第二次调用时,用户点击第三个单元格并且indexPath = [0,3]而不是[0,2]

/ *希望我足够清楚:/ * /

我发现使其工作的唯一方法是使用reloadData,但我希望在删除单元格时有动画。

有没有人有解决方案或提示?

6 个答案:

答案 0 :(得分:8)

你所做的基本上是正确的,但你需要以某种方式重新加载tableView。如果您不想重新加载整个tableView,请使用此功能,这也会为您提供animation -

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:sectionNum];
[self.o_table reloadSections:indexSet 
            withRowAnimation:UITableViewRowAnimationFade];

答案 1 :(得分:5)

  

Swift 2.2

我找到的最佳解决方案是设置NSTimer并在0.5秒之后调用重新加载数据,这为动画提供了足够的时间来完成。 Selector("loadData")是一种包含tableview.reloadData()

的方法
_ = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("loadData"), userInfo: nil, repeats: false)
  

Swift 3.0

_ = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(ViewController.loadData), userInfo: nil, repeats: false)

答案 2 :(得分:1)

reloadSections:方法有效,但它没有为您提供删除行的普通动画,而是使用淡入淡出动画。在iOS 11中,有一种新方法可以解决这个问题:

  [tableView performBatchUpdates:^(
  {
    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
  }
             completion:^(BOOL finished)
  {
    if( finished){ 
      [tableView reloadData];
  }
  }];

答案 3 :(得分:0)

您应该使用beginUpdatesendUpdates包围delteRowsAtIndexPaths:和其他表格编辑操作。这可能会解决您的问题。

答案 4 :(得分:0)

参考上面的答案,这是我的解决方案:

- (void)deleteRowAtIndex:(NSIndexPath *)indexPath{
    [self.dataSource.datas removeObjectAtIndex:indexPath.row];

    [self.tableView beginUpdates];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationBottom];
    [self.tableView endUpdates];
    //    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:indexPath.section];
    //    [self.tableView reloadSections:indexSet
    //                  withRowAnimation:UITableViewRowAnimationNone];
    //    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
    NSLog(@"INDEXPATH:%@",indexPath);
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self.tableView selector:@selector(reloadData) userInfo:nil repeats:NO];
}

答案 5 :(得分:0)

使用以下代码,我能够正确执行此操作,但必须分别针对 iOS 11之前的版本 iOS 11的版本进行单独管理。

请参见以下示例:

var wsconn = new WebSocket('wss://mydomain:11122');