10

我创建了一个方法,当用户想要删除一个单元格时更新我的​​ 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 打印的所有对象。

这种方法在我使用一次时效果很好,但在我多次使用时会失败。

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

例如,

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

我发现使它起作用的唯一方法是使用 reloadData 但我想在单元格删除时制作动画。

我怎样才能做到这一点?

4

6 回答 6

9

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

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:sectionNum];
[self.o_table reloadSections:indexSet 
            withRowAnimation:UITableViewRowAnimationFade];
于 2012-11-12T15:33:28.127 回答
5

斯威夫特 2.2

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

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

斯威夫特 3.0

_ = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(ViewController.loadData), userInfo: nil, repeats: false)
于 2016-01-12T02:03:34.743 回答
1

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

  [tableView performBatchUpdates:^(
  {
    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
  }
             completion:^(BOOL finished)
  {
    if( finished){ 
      [tableView reloadData];
  }
  }];
于 2017-12-10T14:31:29.470 回答
0

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

于 2012-11-12T15:20:39.657 回答
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];
}
于 2016-04-13T06:02:51.140 回答
0

使用以下代码,我可以正确执行此操作,但对于iOS 11 之前的版本和iOS 11之前的版本,我必须单独管理它。

请参见以下示例:

if (@available(iOS 11.0, *)) { // indexPath is your needed indexPath

    [self->chatTableVC.messagesTable performBatchUpdates:^{
    [self->chatTableVC.messagesTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

    } completion:^(BOOL finished) {
         [self->chatTableVC.messagesTable reloadData];
    }];

} else {

    [self->chatTableVC.messagesTable beginUpdates];
    [self->chatTableVC.messagesTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self->chatTableVC.messagesTable endUpdates];

}
于 2018-12-04T18:41:52.747 回答