打开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 }