应用程序尝试以模态方式呈现一个活动控制器:uinavigationcontroller

时间:2014-02-06 19:09:51

标签: ios iphone objective-c uistoryboard

我遇到了一个只会定期引发错误的问题。事实上它似乎几乎是随机的。这是发生的事情,我正在使用以下代码启动模态视图控制器:

- (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>。我在这里做错了什么想法?

3 个答案:

答案 0 :(得分:6)

尝试在故事板中实例化导航控制器中嵌入的控制器,然后创建通用导航控制器的新实例:

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

答案 1 :(得分:1)

我建议为UINavigationController设置一个ivar,因为每次触发动作时,您都会创建一个全新的导航控制器并以模态方式呈现它。

我怀疑当点击操作之间的时间接近时会更频繁地发生这种情况,因此在模态控制器解除后但是没有足够的时间让导航控制器在从同一个类实例化的新控制器之前被解除分配以模态方式再次创建和呈现。通过使用相同的导航控制器,您至少可以确保在通过该方法再次显示之前将其解除。

尝试为导航控制器创建一个ivar,并在每次使用该方法时重复使用。

答案 2 :(得分:-1)

这对我有用:

if let presented = self.presentedViewController,
   !presented.isBeingPresented {
   self.present(navController, animated: true, completion: nil)
}