在iPhone上使用splitviewcontroller时,先呈现细节视图

12
我目前正在开发 iOS 8 并使用新的自适应框架开发应用程序。奇怪的是,当我在 iPhone 上使用此故事板配置的 splitviewcontroller 时,应用程序不会从主视图控制器开始,而是从详细控制器开始。这是一个 bug 吗?我该如何修复它?enter image description here
只有当包含主控制器的 navigationController 存在时才会出现这种情况,如果我将其移除,则应用程序将从主控制器开始启动。

你找到解决方案了吗?我也遇到了同样的问题。 - KD.
我还没有找到解决问题的方法。我记得在WWDC视频中提到,分割视图在主视图和详细视图中管理导航控制器之间的移动。很可能这是一个错误,因为即使是黑客也无法阻止这种行为。不过我可能是错的。 - AJ_1310
3个回答

11

需要意识到的是,当一个分割视图控制器应用程序在 iPhone 6 Plus 的纵向模式下启动时,它只会显示折叠状态下的分割视图控制器。默认情况下,详细视图会被推到主要导航控制器中任何视图控制器的上方。

防止在启动时或横屏后(iPhone 或 iPhone 6 Plus 纵向模式)显示特定视图(例如 iPad 上最初显示的空白详细视图),可以通过处理 splitViewController:collapseSecondaryViewController:ontoPrimaryViewController: 代理方法来实现。这个方法将在展示之前在 iPhone 或 iPhone 6 Plus 的纵向模式下被调用。

这样做,就不需要编写任何特定于设备的代码。

最简单的形式如下所示:

- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController
{
    if ([secondaryViewController isKindOfClass:[BlankViewController class]])
    {
        // If our secondary controller is blank, do the collapse ourself by doing nothing.
        return YES;
    }

    // Otherwise, use the default behaviour. 
    return NO;
}

显然,在splitViewController:separateSecondaryViewControllerFromPrimaryViewController:中,如果您不希望最上面的主视图控制器在分割视图展开后出现在细节侧,则需要执行相反的操作,创建并返回一个BlankViewController作为新的次级视图。

请注意,在这些方法中混合您自己的实现与苹果公司的实现时,它们会做一些疯狂的事情,比如将UINavigationController嵌入到其他UINavigationController中。请参见我在此处给出的相关答案:https://dev59.com/w18e5IYBdhLWcg3wHngs#26090823


4

更新:Michael Wybrow的回答更好。

我遇到了这个问题,并发现以下方法可行:

splitViewController.viewControllers =
    UIScreen.mainScreen.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact ?
    @[ leftNavigationController ] :
    @[ leftNavigationController, rightNavigationController ]
;

在splitview委托方法中:

- (UIViewController *)primaryViewControllerForCollapsingSplitViewController:(UISplitViewController *)splitViewController
{
    return leftNavigationController;
}

- (UIViewController *)primaryViewControllerForExpandingSplitViewController:(UISplitViewController *)splitViewController
{
    return leftNavigationController;
}

- (UIViewController *)splitViewController:(UISplitViewController *)splitViewController separateSecondaryViewControllerFromPrimaryViewController:(UIViewController *)primaryViewController
{
    return rightNavigationController;
}

我知道这很糟糕,但它做了正确的事情,尤其是在 iPhone 6 Plus 上,这非常棘手。

更新:Michael Wybrow 的答案更好。


0

这可能是由于 SplitViewController 只在 iPad 上可用所导致的错误。此外,当您将其设置为纵向时,默认情况下会显示详细视图,并且主视图将以栏的形式显示。您需要使用一些方法进行更改,比如 splitViewController:shouldHideViewController:inOrientation

以下是苹果文档中涉及到您的问题的链接

https://developer.apple.com/library/ios/documentation/uikit/reference/UISplitViewController_class/Reference/Reference.html

希望这能帮到你!


非常感谢您的回答。 - AJ_1310
2
这个答案已经过时了 - 自iOS 8以来,UISplitViewController不再是独家的了,按照您最初发布的方式使用它是通用应用程序在iPad(和iPhone 6 Plus)上想要分割视图的官方推荐方式。 - Marco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接