当用户想删除一个单元格时,我创建了一个更新我的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,但我希望在删除单元格时有动画。
有没有人有解决方案或提示?
答案 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)
您应该使用beginUpdates和endUpdates包围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');