Последовательные вызовы метода presentViewController UIViewController

Недавно я столкнулся с неприятной ситуацией в своем 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)];

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

7
задан KevinH 17 May 2012 в 04:51
поделиться