indexPath не обновляется после использования deleteRowsAtIndexPaths
Я создал метод, который обновляет мой 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, но я хочу иметь анимацию при удалении ячейки.
у кого-нибудь есть решение или намек ?
5 ответов
то, что вы делаете, в основном правильно, но вам нужно перезагрузить tableView
почему-то. Если вы не хотите, чтобы перезагрузить всю tableView
, используйте это, что дает вам animation
а также -
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:sectionNum];
[self.o_table reloadSections:indexSet
withRowAnimation:UITableViewRowAnimationFade];
Swift 2.2
лучшее решение, которое я нашел, - установить NSTimer
и вызовите данные перезагрузки через 0,5 сек, что дает достаточно времени для завершения анимации. The 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)
вы должны окружить delteRowsAtIndexPaths: и другие операции редактирования таблицы с beginUpdates и endUpdates. Это может решить вашу проблему.
обратитесь к приведенному выше ответу, вот мое решение:
- (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];
}
на reloadSections:
метод работает, но он не дает вам обычную анимацию для удаления строки, вместо этого используя анимацию затухания. В iOS 11 доступен новый метод, который решает это:
[tableView performBatchUpdates:^(
{
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
completion:^(BOOL finished)
{
if( finished){
[tableView reloadData];
}
}];