我如何检测UISplitViewController
目前是否只显示 1个视图控制器,或者它是否显示在 2个视图控制器的双窗格中侧由端?
答案 0 :(得分:10)
拆分视图控制器反映displayMode属性中的实际显示模式:
AllVisible :主要和辅助UIViewControllers并排显示。
PrimaryHidden :隐藏了主要的UISplitViewController。
PrimaryOverlay :主要的UISplitViewController覆盖了辅助部分,部分可见。
当 isCollapsed 属性为 true 时,将忽略 displayMode 属性的值。折叠的拆分视图界面包含仅一个视图控制器,因此显示模式是多余的。
恢复 :要了解屏幕上的详细情况,请使用 isCollapsed 属性和(如果 isCollapsed = false) displayMode 属性。
答案 1 :(得分:5)
这是一个简单的案例:
您在MasterViewController上并选择了一个单元格。现在,根据UISplitViewController是否折叠,你想要执行一个segue(用红色圈出)
到DetailViewController(折叠)或更新DetailViewController(未折叠)。
在你的" didSelectRowAtIndexPath" MasterViewController上的方法获取对UISplitViewController的引用,并选择这样做:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//Reference to Split View
guard let splitView = self.splitViewController else {
return
}
//Check the collapsed property
if splitView.collapsed {
self.performSegueWithIdentifier("segueToDetail", sender: self)
}else {
//Get reference to your details navigation controller
guard let detailViewNavigationController = self.splitViewController?.viewControllers[1] as? UINavigationController else {
return
}
//Get a reference to your custom detail view controller
guard let detailController = detailViewNavigationController.viewControllers[0] as? MyCustomViewController else {
return
}
//Call your custom function to update the detail view controller
detailController.updateSomething()
}
}
如果您不想使用"折叠" UISplitViewController的属性可以像这样检查视图控制器属性的数量。
if splitView.viewControllers.count == 1 {
self.performSegueWithIdentifier("segueToDetail", sender: self)
}else splitView.viewControllers.count == 2 {
guard let detailViewNavigationController = self.splitViewController?.viewControllers[1] as? UINavigationController else {
return
}
guard let detailController = detailViewNavigationController.viewControllers[0] as? MyCustomViewController else {
return
}
detailController.updateSomething()
}
另一个选项是从主视图控制器到详细视图控制器设置委派。如果你不想像这个例子那样想要访问视图控制器链,这将很有效。这是一个tutorial on this method。注意"用细节连接主人"部分。
只是一个注释:I tested switching on the UISplitViewControllers "displayMode" property.这个属性没有给我足够的信息来弄清楚要做什么。原因是当您处于水平紧凑模式和水平扩展模式时,属性设置为.AllVisible。
最后,在我走之前。我喜欢我的方式,因为很多时候你知道你需要一个UISplitViewController,所以你从模板创建一个项目。你会注意到模板附带了segue设置。这个模板适用于手机,但不适用于iPad和iPhone6 +。如果在项目创建后将UISplitViewController拖放到故事板上,您会注意到详细视图既未嵌入UINavigationController中,也未存在从主控制到详细信息的segue。设想我想更多!
答案 2 :(得分:0)
UISplitViewController有一个名为'collapsed'的属性。