Исключение при представлении контроллера модального представления: NSInternalInconsistencyException

когда я пытаюсь представить контроллер модального представления, возникает исключение:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Attempting to begin a modal transition from <UINavigationController: 0x1d906060>
to <UINavigationController: 0x1da7a6d0> while a transition is already in progress. Wait
for viewDidAppear/viewDidDisappear to know the current transition has completed'

Теперь я читал похожие вопросы, где они просто открывали модальное представление с небольшой задержкой, например

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(openModalController) userInfo:nil repeats:NO];

Презентация выглядит так:

- (void)openImage:(ImageModel *)imageModel{
FullscreenImageViewController_iPhone * controller = [[FullscreenImageViewController_iPhone alloc] init];
controller.imageModel = imageModel;
UINavigationController * navController = [[UINavigationController alloc] initWithRootViewController:controller];
UIViewController * visibleController = [[AppDelegate_iPhone app] visibleViewController];
[visibleController presentViewController:navController animated:YES completion:^{

}];
}

Это не может быть реальным решением, не так ли? Как я могу проверить, происходит ли какой-то переход где-то в моем приложении, и открыть новый модальный вид сразу после завершения текущего перехода?


person stk    schedule 11.12.2012    source источник
comment
Было бы полезно, если бы вы показали свой код перехода.   -  person Mick MacCallum    schedule 11.12.2012
comment
Я видел, как эта ошибка возникает, когда вы пытаетесь представить модальное окно из метода viewDidLoad. Это то, что ты делаешь? Если это так, вы можете переместить код презентации в viewDidAppear.   -  person rdelmar    schedule 11.12.2012
comment
Нет, он срабатывает во время простоя. Пользователь нажимает на что-то, затем что-то открывается в полноэкранном режиме.   -  person stk    schedule 11.12.2012
comment
Вы либо пытаетесь представить один контроллер модального представления, в то время как другой отклоняется (анимации перекрываются), либо, возможно, вы каким-то образом представляете новый контроллер дважды практически в одно и то же время.   -  person rmaddy    schedule 11.12.2012
comment
Спасибо, rmaddy, я думаю, это уже было ясно. Я ищу что-то вроде очереди, которая отображает переходы один за другим, или что-то вроде статического метода UIView, который мог бы сказать мне, происходит ли уже переход. Кто-нибудь слышал о таких вещах?   -  person stk    schedule 20.12.2012


Ответы (1)


Это работает для меня. Если вы используете методы isBeingPresented и isBeingDismissed UIViewController, чтобы проверить, продолжается ли презентация или отклонение, подождите некоторое время и повторите попытку:

- (void) presentVC {    
    if (presentingVC.isBeingPresented || presentingVC.isBeingDismissed) {
         double delayInSeconds = 0.3;
         dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
         dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
               [self presentVC];
         });
    }
    else {
        [presentingVC presentViewController:presentedVC animated:NO completion:nil];
    }
}
person Mikkel Selsøe    schedule 27.11.2013
comment
Как вы, наверное, видите из моего фрагмента кода, проблема в том, что есть 2 ViewController'а. Итак, есть один венчурный капитал, который в настоящее время что-то закрывает, и в то же время венчурный капитал, который я хочу открыть. Таким образом, при вашем подходе у вас должен быть экземпляр обоих VC, которых у меня нет в большей части моего кода. - person stk; 02.12.2013
comment
OK. Вы можете сохранить представленный VC в переменной экземпляра до тех пор, пока он не будет представлен (то есть до тех пор, пока не будет вызван блок завершения). - person Mikkel Selsøe; 03.12.2013