Swift:如何检测UISplitViewController当前是否显示1个或2个控制器?

时间:2015-11-15 14:56:03

标签: ios swift uisplitviewcontroller master-detail

我如何检测UISplitViewController目前是否只显示 1个视图控制器,或者它是否显示在 2个视图控制器的双窗格中侧由端?

3 个答案:

答案 0 :(得分:10)

拆分视图控制器反映displayMode属性中的实际显示模式:

AllVisible :主要和辅助UIViewControllers并排显示。

PrimaryHidden :隐藏了主要的UISplitViewController。

PrimaryOverlay :主要的UISplitViewController覆盖了辅助部分,部分可见。

isCollapsed 属性为 true 时,将忽略 displayMode 属性的值。折叠的拆分视图界面包含仅一个视图控制器,因此显示模式是多余的。

恢复 :要了解屏幕上的详细情况,请使用 isCollapsed 属性(如果 isCollapsed = false) displayMode 属性。

答案 1 :(得分:5)

这是一个简单的案例:

您在MasterViewController上并选择了一个单元格。现在,根据UISplitViewController是否折叠,你想要执行一个segue(用红色圈出)

Segue to perform

到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'的属性。