“应用程序试图以模态方式呈现拆分视图控制器”

时间:2013-12-02 11:02:47

标签: ios ipad uisplitviewcontroller

我仍在尝试找到一个理论上非常简单的任务的解决方案,从UIViewController到Split View Controller。 (为什么苹果这么困难)。

我现在处于一个阶段,我现在将SplitViewController放入自己的故事板中。 当用户选择单个UIView控制器上的按钮时,我调用以下代码:

UISplitViewController *splitVC = [[UIStoryboard storyboardWithName:@"SplitStoryBoard" bundle:nil] instantiateViewController];
    [self presentViewController:splitVC animated:YES completion:nil];

所以我想用splitview控制器加载故事板。 但这也会因“应用程序试图以模态方式呈现分割视图控制器”而崩溃。

我没有在代码中指定任何“模态”操作。

有没有解决方法如何做到这一点?

5 个答案:

答案 0 :(得分:3)

UISplitViewController必须始终是根视图控制器,并且不能以模态方式呈现。请参阅Apple docs,其中包含:

  

拆分视图控制器必须始终是您所有接口的根   创建。换句话说,您必须始终从a安装视图   UISplitViewController对象作为应用程序的根视图   窗口。然后可以包含拆分视图界面的窗格   导航控制器,标签栏控制器或任何其他类型的视图   你需要控制器来实现你的界面。拆分视图   控制器不能以模态方式呈现。

答案 1 :(得分:2)

您可以使用splitViewController作为TabViewController的视图,但splitViewController不能是传统意义上的模态控制器。要从UIViewController转换到SplitViewController,请使用以下代码:

- (IBAction)setupTapped:(id)sender {
    static NSString *tabViewControllerIdentifier = @"SetupViewController";  


    UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:tabViewControllerIdentifier];
    AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    UIViewController *currentController = app.window.rootViewController;
    app.window.rootViewController = controller;
    app.window.rootViewController = currentController;

    [UIView transitionWithView:self.navigationController.view.window
                      duration:0.75
                       options:UIViewAnimationOptionTransitionFlipFromRight
                    animations:^{
                        app.window.rootViewController = controller;
                    }
                    completion:nil];
}

那将在控制器之间转换。您可以更改动画类型以适合您的目的。这是使用options参数设置的;目前正在显示UIViewAnimationOptionTransitionFlipFromRight。

答案 2 :(得分:1)

这是一个很老的问题。但是我在我的应用程序中使用下面的代码工作了,我认为这是更好的解决方案。

[self addChildViewController:<# Your Split VC #>];
[<# Your Split VC #>.view willMoveToSuperview:self.view];
<# Your Split VC #>.view.frame = self.view.frame;
[self.view addSubview:<# Your Split VC #>.view];
[<# Your Split VC #>.view didMoveToSuperview];

我们的想法是采用视图控制器(Parent)并将拆分视图控制器添加为其子视图。像对待任何其他控制器一样,将模型segue执行到父级。

嗯,我不确定,但是从iOS8开始,SplitViewController变得更好了,除了根视图控制器之外,还可以在其他地方使用它。

干杯!

答案 3 :(得分:0)

如果您在故事板中创建了UISplitViewController,并且在拆分视图之前添加了主视图,则可以使用performSegueWithIdentifier触发主视图和拆分视图之间的seque。 要修复标题中的错误,您需要覆盖UISplitViewController

中的一种方法
// Swift
override func awakeFromNib() {
    let app = UIApplication.sharedApplication().delegate as AppDelegate

    let currentController = app.window!.rootViewController;
    app.window!.rootViewController = self;
}

答案 4 :(得分:0)

是的,它可以从UIView传递到UISplitView。你必须使用自定义segue。

阅读此链接(从日语翻译)

UIViewController to UISplitViewController