打开UISplitViewController到主视图而不是细节

我有一个目标iPhone 6应用程序的分割视图界面。 在应用程序首次启动时,它将打开Detail View; 我希望它打开主视图。 我努力了:

self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryOverlay 

在其他地方(Prior StackOverFlow Question)提出了这个问题,但是它似乎没有做任何事情,并且在启动时不打开主视图。 我也尝试添加下面的行到我的AppDelegate:

 splitViewController:collapseSecondaryViewController:ontoPrimaryViewController: 

但是,尽pipe返回true或false( 另一个先前堆栈溢出问题 ),我没有成功。

我在Xcode中启动了示例Master-Detail应用程序,并基于splitViewController:call返回false来加载到主视图。 但是,我不知道如何使这个工作在一个更复杂的布局。

迅速

UISplitViewController在纵向方向上显示以上细节的主视图不是关于显示主视图,而是关于在主视图下方以全angular显示细节视图。

UISplitViewController在iPhone上的纵向显示细节VC而不是主要关于崩溃机制的原理。

现在的答案是:

  • 大师→详细 (紧凑宽度)
    • iPhone 4s,5s,5s,6s,6s,7(任何方向)
    • iPod Touch
    • 任何iPhone Plus(人像)
  • 并排 (所有其他尺寸)
    • iPad的
    • 任何iPhone Plus(横向)

您必须设置preferredDisplayMode 。 如果它存在,你会想要.primaryVisible ! 使用.allVisible ,如果只有1个视图适合,iOS会selectDetail (紧凑宽度) ; 在这个规模下,下面的代码将selectMaster

诀窍是将preferredDisplayMode改为.allVisible collapseSecondary:onto to中返回true

 class PrimarySplitViewController: UISplitViewController, UISplitViewControllerDelegate { override func viewDidLoad() { self.delegate = self self.preferredDisplayMode = .allVisible } func splitViewController( _ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { // Return true to prevent UIKit from applying its default behavior return true } } 

在应用程序首次启动时,它将打开Detail View; 我希望它打开主视图

假设你只想在第一次启动时,但不总是; 例如在主视图显示空数据集的情况下; 那么解决scheme就像Master-Detail模板显示的那样:

 func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController, ontoPrimaryViewController primaryViewController:UIViewController) -> Bool { guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false } guard let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController else { return false } if topAsDetailController.detailItem == nil { // Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded. return true } return false }