UINabigationController里面的一个UITabBarController里面的UISplitViewController在iPhone上以模态方式呈现

Pet*_*ttl 13 iphone uitabbarcontroller uinavigationcontroller uisplitviewcontroller ios8

我有一个UISplitViewController,它包含一个UITabBarController作为主视图.这个UITabBarController包含一个UINavigationController.详细视图也包含UINavigationController.

故事板

在iPad上,这可以按预期工作.的节目详细赛格瑞呈现在详细视图中导航控制器内的ImageView的.

另一方面,在iPhone上,我预计show detail segue会在主视图的导航控制器的堆栈上推送详细视图.但实际上它是在主视图上以模态方式呈现的.

从故事板中删除UITabBarController并直接在主视图中使用UINavigationController时,这可以正常工作.

有谁知道如何在iPhone上的主人UINavigationController堆栈上呈现详细视图?

Dre*_*ary 9

彼得的解决方案的问题在于它将与iPhone 6 +分道扬.. 怎么会这样?使用该代码,如果iPhone 6 +处于纵向 - 细节视图将推入导航堆栈.到目前为止一切都很顺利.现在,旋转到横向,然后您将显示详细视图作为详细视图主视图.

您需要拆分视图控制器的委托来实现两种方法:

- (BOOL)splitViewController:(UISplitViewController *)splitViewController showDetailViewController:(UIViewController *)detailVC sender:(id)sender
{
    UITabBarController *masterVC = splitViewController.viewControllers[0];

    if (splitViewController.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact)
        [masterVC.selectedViewController showViewController:detailVC sender:sender];
    else
        [splitViewController setViewControllers:@[masterVC, detailVC]];

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

现在,您需要从选定选项卡的导航控制器返回顶视图控制器:

- (UIViewController*)splitViewController:(UISplitViewController *)splitViewController separateSecondaryViewControllerFromPrimaryViewController:(UIViewController *)primaryViewController
{
    UITabBarController *masterVC = splitViewController.viewControllers[0];

    if ([(UINavigationController*)masterVC.selectedViewController viewControllers].count > 1)
        return [(UINavigationController*)masterVC.selectedViewController popViewControllerAnimated:NO];
    else
        return nil; // Use the default implementation
}
Run Code Online (Sandbox Code Playgroud)

有了这个解决方案,一切都会推送到导航堆栈,并且还可以在iPad/6 +横向上正确更新详细视图.


Pet*_*ttl 8

我想出了如何将细节放到master的UINavigationController上,而不是通过UITabBarController以模态方式呈现它.

使用UISplitViewControllerDelegate方法

- splitViewController:showDetailViewController:sender:
Run Code Online (Sandbox Code Playgroud)

如果UISplitViewController折叠,请获取主控导航控制器并将详细视图推送到此导航控制器:

- (BOOL)splitViewController:(UISplitViewController *)splitViewController
   showDetailViewController:(UIViewController *)vc
                     sender:(id)sender {
    NSLog(@"UISplitViewController collapsed: %d", splitViewController.collapsed);

    // TODO: add introspection
    if (splitViewController.collapsed) {
        UITabBarController *master = (UITabBarController *) splitViewController.viewControllers[0];
        UINavigationController *masterNavigationController = (UINavigationController *)master.selectedViewController;

        // push detail view on the navigation controller
        //[masterNavigationController pushViewController:vc animated:YES];
        // push was not always working (see discussion in answer below), use showViewController instead
        [masterNavigationController showViewController:vc sender:sender];

        return YES;
    }

    return NO;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案不适用于iPhone 6 +.以纵向方式启动您的应用,转到详细视图.然后更改为横向,您的详细视图和主视图都将显示详细视图. (2认同)