Как я могу узнать, когда [UITableView setEditing: YES animated: YES] завершился?

Я не хочу приводить какой-либо контекст, потому что я хочу, чтобы кто-нибудь не предлагал мне обходные пути, которые меня не интересуют.

Я хочу вызвать вышеупомянутое, а затем вызвать отдельную функцию, когда анимация будет завершена.


Я отредактировал сообщение, чтобы дать контекст и некоторые обходные пути. Изначально я установил Edit и сразу перезагрузил данные таблицы.

[tableView setEditing:YES animated:YES];
[tableView reloadData];

Проблема в том, что таблица перезагружается до начала анимации, поэтому анимация никогда не отображается.

Вот несколько способов обхода:

[tableView setEditing:YES animated:YES];
[self performSelector:@selector(ReloadTable) withObject:nil afterDelay:1.0];

Это работает, но если я получу неправильную задержку, это будет плохо выглядеть. Поэтому мне нужно знать, что такое задержка, и я могу это выяснить, но мы не уверены, что задержка всегда будет одинаковой.

isEditing = YES;
[tableView reloadData];
[tableView setEditing:YES animated:YES];

Это может сработать, но таблица ведет себя по-разному в зависимости от того, находимся ли мы в режиме редактирования. Поэтому я должен использовать свою собственную переменную isEditing вместо стандартной UITableView.editing. Я бы предпочел не создавать новую логическую переменную isEditing.

[tableView setEditing:YES animated:YES];
[tableView insertRowsAtIndexPaths:path withRowAnimation:UITableViewRowAnimationTop];

Это почти хорошо работает, но в режиме редактирования первая строка должна иметь UITableViewCellEditingStyleInsert, а другие строки - UITableViewCellEditingStyleDelete. И с помощью приведенного выше кода стиль редактирования устанавливается ДО добавления строки. Таким образом, вторая строка заканчивается UITableViewCellEditingStyleInsert.

19
jriggs 26 Авг 2011 в 04:02

3 ответа

Лучший ответ
[CATransaction begin];
[CATransaction setCompletionBlock: ^{
    // your animation has finished
}];
[tableView setEditing:YES animated:YES];
[CATransaction commit];

Обратите внимание, что setCompletionBlock должен быть наверху.

49
Rudolf Adamkovič 31 Янв 2013 в 18:13

В iOS 4 вы можете делать следующее:

[UIView animateWithDuration:0.3f
                 animations:^{
                     [self.tableView setEditing:YES animated:NO];
                 } 
                 completion:^(BOOL finished){
                     // Do something
                 }
];
3
Jesse 8 Фев 2012 в 22:15

Версия принятого ответа Swift 4 :

CATransaction.begin()
CATransaction.setCompletionBlock {
    // your animation has finished
}
tableView.setEditing(true, animated: true)
CATransaction.commit()
3
Mohit Singh 6 Фев 2018 в 16:18