ios – 为什么我不能在第一次运行时在UISplitViewController中放置“Master”和“Detail”视图,但是在旋转时它可以工作?

前端之家收集整理的这篇文章主要介绍了ios – 为什么我不能在第一次运行时在UISplitViewController中放置“Master”和“Detail”视图,但是在旋转时它可以工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个分割视图控制器,其中包含左侧的项目列表和右侧的详细视图. AppDelegate中的相关代码
let splitViewController = mainView.instantiateViewControllerWithIdentifier("initial") as! UISplitViewController



        let rightNavController = splitViewController.viewControllers.last as! UINavigationController
        let detailViewController = rightNavController.topViewController as! DetailsIpad

        let leftNavController = splitViewController.viewControllers.first as! UINavigationController
        let masterViewController = leftNavController.topViewController as! MainViewController

        masterSplitViewController = masterViewController
        detailSplitViewController = detailViewController

        // Override point for customization after application launch.
        let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
        navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
        splitViewController.delegate = self

        self.window!.rootViewController = splitViewController

当我第一次启动应用程序时,我看到分屏的正确部分占用了所有屏幕:

如果我旋转屏幕,它变得正确设置(可能是因为屏幕上同时显示两个视图):

当我在任何地方设置断点时,我看到右侧的详细信息视图在左侧的主视图(项目列表)之前被加载,尽管没有被直接调用.
我无法更改调用分屏的视图的顺序.如何解决这个问题?

更新:

我可以在显示分割视图控制器之前设置此选项:

splitViewController.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible

当我打印时,在分割控制器的ViewDidLoad中:

print(self.preferredDisplayMode.rawValue)

我得到:2,这是AllVisible.但仍然是结果是一样的.

解决方法

这是UISplitViewController的默认行为.仔细看看下面的 –
// An animatable property that controls how the primary view controller is hidden and displayed. A value of `UISplitViewControllerDisplayModeAutomatic` specifies the default behavior split view controller,which on an iPad,corresponds to an overlay mode in portrait and a side-by-side mode in landscape.
@property (nonatomic) UISplitViewControllerDisplayMode preferredDisplayMode NS_AVAILABLE_IOS(8_0);

这是相同定义的关键部分 –

on an iPad,corresponds to an overlay mode in portrait and a side-by-side mode in landscape.

此外,如果要查询UISplitViewController的当前状态(显示模式),您应该使用此属性

// The actual current displayMode of the split view controller. This will never return `UISplitViewControllerDisplayModeAutomatic`.
@property (nonatomic,readonly) UISplitViewControllerDisplayMode displayMode NS_AVAILABLE_IOS(8_0);

并记住,您无法将其与UISplitViewControllerDisplayModeAutomatic进行比较,因为 –

This will never return UISplitViewControllerDisplayModeAutomatic.

我的建议是将preferredDisplayMode设置为所需的值.在你的情况下,您似乎需要主(主)始终可见.所以这里提出的解决方案 –

mySplitVC.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible

为什么首先加载次要(详细)控制器?

如您所见,UISplitViewController实例总是需要一个详细的视图,无论现在是什么显示模式.所以这是一个很好的电话

>先加载细节视图.
>加载主视图(有条件地基于displayMode).

希望这可以帮助.

猜你在找的iOS相关文章