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];
  }
  }];