Недавно я столкнулась с ситуацией, таскание за волосы в мое приложение IOS, где я пытался последовательно смещать один представил UIViewController
из RootViewController моего окна, используя:Последовательные вызовы метода presentViewController UIViewController в
[rootViewController dismissViewControllerAnimated:YES completion:NULL]
и представить еще один вскоре после этого (в другом методе, кстати), с:
UIViewController *vc2 = [[[MyViewController2 alloc] initWithNibName:nil bundle:nil] autorelease];
[rootViewController presentViewController:vc2 animated:YES completion:NULL];
Проблема была, я никогда не мог получить второй контроллер представления обнаруживаться. Оказывается, насколько я могу судить, dismissViewControllerAnimated:completion:
нуждается в том, чтобы асинхронный блок «завершения» времени прошел, до того, как presentViewController:animated:completion:
снова будет работать правильно. Этот факт напрямую не задокументирован в Apple's docs, из того, что я могу сказать.
Решение, которое я придумал было завернуть увольнение с методом, который указывает селектор вы хотите позвонить, после этого, как так:
- (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)];
В любом случае, я хотел опубликовать сообщение, поскольку я огляделся и не видел никого с этой конкретной проблемой, поэтому я подумал, что это может быть полезно для людей понять. Кроме того, я хотел проверить, что я не взламываю решение, которое имеет лучший дизайн для разрешения.
Я считаю, что код должен работать. В моем примере я использовал presentViewController в качестве последующего вызова, но я бы предположил, что вы столкнулись бы с той же проблемой с вашим кодом, если бы вместо принятия действий в блоке завершения вы сделали: '[myRootViewController rejectViewControllerAnimated: YES complete: NULL ]; [myRootViewController pushViewController: newController animated: YES]; ' – KevinH