我遇到了一个问题,即错误只定期出现。事实上,它看起来几乎是随机的。事情是这样的,我用下面的代码启动一个模态视图控制器。
- (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>
. 有什么想法,我在这里做错了吗?
尝试实例化你的故事板中嵌入导航控制器的控制器,然后创建一个通用导航控制器的新实例。
HICompseController *controller = [sb instantiateViewController:
HIComposeMessageViewController];
UINavigationController *nav = [[UINavigationController alloc]
initWithRootViewController:controller];
[self presentViewController:nav animated:YES completion:nil];
我建议为你的导航控制器设置一个ivar UINavigationController
因为每次动作被触发时,你都会创建一个全新的导航控制器,并以模态方式呈现。
我猜测它更经常发生在点击动作之间的时间很近的时候,因此在模态控制器被解雇后,但没有得到足够的时间让导航控制器被deallocated,然后再创建一个从同一个类实例化的新的导航控制器并以模态方式再次呈现。通过使用相同的导航控制器,你至少可以确保它在通过该方法再次呈现之前已经被解雇。
试着为导航控制器创建一个ivar,然后每次在该方法中重用它。
这对我来说是有效的。
if let presented = self.presentedViewController,
!presented.isBeingPresented {
self.present(navController, animated: true, completion: nil)
}