Я досяг цього саме з точністю, використовуючи блок. Я хотів, щоб мій контролер результатів показав рядок, який додав модальний вигляд, лише після того, як він повністю вийшов з екрана, щоб користувач міг бачити зміни, що відбуваються. Готуючись до segue, який відповідає за показ контролера модального перегляду, я встановлюю блок, який я хочу виконати, коли модаль зникає. І в контролері модального перегляду я переосмислюю viewDidDissapear, а потім викликаю блок. Я просто починаю оновлення, коли модал з'явиться, і закінчую оновлення, коли він зникає, але це тому, що я використовую NSFetchedResultsController, однак ви можете робити все, що завгодно, всередині блоку.
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"addPassword"]){
UINavigationController* nav = (UINavigationController*)segue.destinationViewController;
AddPasswordViewController* v = (AddPasswordViewController*)nav.topViewController;
...
// makes row appear after modal is away.
[self.tableView beginUpdates];
[v setViewDidDissapear:^(BOOL animated) {
[self.tableView endUpdates];
}];
}
}
@interface AddPasswordViewController : UITableViewController<UITextFieldDelegate>
...
@property (nonatomic, copy, nullable) void (^viewDidDissapear)(BOOL animated);
@end
@implementation AddPasswordViewController{
...
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
if(self.viewDidDissapear){
self.viewDidDissapear(animated);
}
}
@end