我有一个分割视图控制器,其中包含左侧的项目列表和右侧的详细视图. 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).
希望这可以帮助.