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

Dan*_*e B 7 master-detail uisplitviewcontroller ios swift

如何检测UISplitViewController当前是仅显示1个视图控制器还是在双窗格中,并排显示2个视图控制器

Ord*_*Dei 10

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

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

PrimaryHidden:主要的UISplitViewController被隐藏.

PrimaryOverlay:主要UISplitViewController覆盖辅助节点,它是部分可见的.

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


简历:要查看屏幕上的详细情况,请使用isCollapsed属性 (如果isCollapsed = false)displayMode属性.

  • 小心这些不是在 viewDidLoad 和 viewWillAppear 中设置的。如果您需要在加载时执行某些操作,则需要检查 viewDidAppear。 (2认同)

Jon*_*gel 6

这是一个简单的案例:

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

想要表演

到DetailViewController(折叠)或更新DetailViewController(未折叠).

在MasterViewController上的"didSelectRowAtIndexPath"方法中获取对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()
        }
     }
Run Code Online (Sandbox Code Playgroud)

如果您不想使用UISplitViewController的"collapsed"属性,可以像这样检查视图控制器属性的数量.

        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()
        }
Run Code Online (Sandbox Code Playgroud)

另一个选项是从主视图控制器到详细视图控制器设置委派.如果你不想像这个例子那样必须到达视图控制器链,这将很有效.这是关于此方法教程.请注意"使用详细信息连接主人"部分.

请注意:我测试了UISplitViewControllers"displayMode"属性的切换.这个属性没有给我足够的信息来弄清楚要做什么.原因是当您处于水平紧凑模式和水平扩展模式时,属性设置为.AllVisible.

最后,在我走之前.我喜欢我的方式,因为很多时候你知道你需要一个UISplitViewController,所以你从模板创建一个项目.你会注意到模板附带了segue设置.这个模板适用于手机,但不适用于iPad和iPhone6 +.如果在创建项目后将UISplitViewController拖放到故事板上,您会注意到详细视图既未嵌入UINavigationController中,也未存在从主控制到详细信息的segue.设想我想更多!


Jas*_*Nam 0

UISplitViewController 有一个名为“collapsed”的属性。

  • 在 iPhone 上,第一次启动时“崩溃”总是错误的,然后在一段时间后崩溃了。 (4认同)