Недавно я столкнулся с неприятной ситуацией в своем iOS-приложении, когда я пытался последовательно удалить один представленный UIViewController
из rootViewController моего окна, используя:
[rootViewController dismissViewControllerAnimated:YES completion:NULL]
и представить другой вскоре после этого (между прочим, в другом методе), с:
UIViewController *vc2 = [[[MyViewController2 alloc] initWithNibName:nil bundle:nil] autorelease];
[rootViewController presentViewController:vc2 animated:YES completion:NULL];
Проблема заключалась в том, что я никогда не мог заставить второй контроллер представления появиться. Оказывается, насколько я могу судить, rejectViewControllerAnimated:completion:
нуждается в прохождении этого асинхронного блока времени «завершения», прежде чем presentViewController:animated:completion:
снова заработает правильно. Насколько я могу судить, этот факт напрямую не задокументирован в документах Apple.
Решение, которое я придумал, состояло в том, чтобы обернуть увольнение методом, который указывает селектор, который вы хотите вызвать впоследствии, например так:
- (void)dismissViewController:(UIViewController *)presentingController
postAction:(SEL)postDismissalAction
{
[presentingController dismissViewControllerAnimated:YES
completion:^{
[self performSelectorOnMainThread:postDismissalAction
withObject:nil
waitUntilDone:NO];
}];
}
И затем я вызывал:
[self dismissViewController:self.window.rootViewController
postAction:@selector(methodForNextModalPresentation)];
В любом случае, я хотел опубликовать когда я огляделся и не увидел никого с этой конкретной проблемой, я подумал, что людям будет полезно понять. Кроме того, я хотел убедиться, что я не взламываю решение, которое имеет лучший шаблон проектирования для разрешения.