2012-05-17 1 views
7

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

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

ответ

2

Просто для ясности. вы говорите, что этот код не работает?

[myRootViewController dismissViewControllerAnimated:YES completion:^{ 
    [myRootViewController pushViewController:newController animated:YES]; 
}]; 
+0

Я считаю, что код должен работать. В моем примере я использовал presentViewController в качестве последующего вызова, но я бы предположил, что вы столкнулись бы с той же проблемой с вашим кодом, если бы вместо принятия действий в блоке завершения вы сделали: '[myRootViewController rejectViewControllerAnimated: YES complete: NULL ]; [myRootViewController pushViewController: newController animated: YES]; ' – KevinH

 Смежные вопросы

  • Нет связанных вопросов^_^