在iPhone上使用splitviewcontroller首先描绘详细视图

时间:2014-07-12 01:39:38

标签: ios iphone objective-c uisplitviewcontroller

我目前正在为iOS 8开发并使用新的自适应框架开发应用程序。奇怪的是当我使用iPhone上的splitviewcontroller与这个故事板配置时,应用程序不是从主视图控制器开始,而是从细节控制器开始。这是一个错误,我怎么能修复它?enter image description here

只有当包含master的navigationController存在时才会发生这种情况,如果删除它,应用程序将以主控制器启动。

3 个答案:

答案 0 :(得分:11)

要实现的是,当分割视图控制器应用程序以纵向方式在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

请注意在这些方法中将自己的实现与Apple混合,他们会做一些疯狂的事情,比如在其他UINavigationControllers中嵌入UINavigationControllers。请在此处查看我的相关答案:https://stackoverflow.com/a/26090823/4089333

答案 1 :(得分: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的答案更好。

答案 2 :(得分:0)

由于SplitViewController仅适用于iPad,因此可能会出错。此外,当您以纵向方向显示时,它默认显示详细视图,主视图将显示为条形。您必须使用splitViewController:shouldHideViewController:inOrientation

等方法更改它

这是一份引用您问题的Apple文档

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

我希望这有帮助!