2014-02-06 2 views
3

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

- (void)createMessageClicked 
{ 
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Channel" bundle:nil]; 
    UINavigationController *nav = [sb instantiateViewControllerWithIdentifier:@"HIComposeMessageNavController"]; 
    HIComposeMessageViewController *vc = [[nav viewControllers]objectAtIndex:0]; 

    vc.channel = [self.channels objectAtIndex:0]; 
    [self.navigationController presentViewController:nav animated:YES completion:nil]; 
} 

Большую часть времени, это работает отлично. Однако время от времени приложение выходит из строя и вызывает ошибку "Application tried to present modally an active controller <UINavigationController>. Любые идеи, что я делаю неправильно здесь?

ответ

6

Попробуйте инстанцирование контроллера, который встроен в навигационном контроллере в раскадровке, а затем создать новый экземпляр универсального навигационного контроллера:

HICompseController *controller = [sb instantiateViewController: 
            HIComposeMessageViewController]; 
UINavigationController *nav = [[UINavigationController alloc] 
           initWithRootViewController:controller]; 
[self presentViewController:nav animated:YES completion:nil]; 
+2

Я сделал это раньше и получил ту же ошибку, поэтому я сделал это в первую очередь –

+0

@NickONeill Я отредактировал свой ответ на основе вашего комментария. – Steve

+1

Так что это работает. Но зачем это нужно в первую очередь? Кто-нибудь узнал? –

1

Я хотел бы предложить установив Ивар для UINavigationController, потому что каждый раз действие запускается, вы создаете совершенно новый навигационный контроллер и представляете его модально.

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

Попробуйте создать ivar для контроллера навигации и повторно использовать его каждый раз в этом методе.

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