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

我该如何检测UISplitViewController目前是否只显示1个视图控制器,或者它是否在双窗格中并排显示2个视图控制器

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

AllVisible :主要和次要的UIViewControllers是并排显示的。

PrimaryHidden :隐藏主UISplitViewController。

PrimaryOverlay :主要的UISplitViewController覆盖次要的,这是部分可见的。

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


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

这是一个简单的例子:

您在MasterViewController上,并select一个单元格。 现在,取决于如果UISplitViewController崩溃或不想要执行一个segue(用红色圈出)

要去执行

到DetailViewController(折叠)或更新DetailViewController(不折叠)。

在您的MasterViewController的“didSelectRowAtIndexPath”方法中,获取对UISplitViewController的引用,并select如下操作:

  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的“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() } 

另一个选项是设置从你的主视图控制器到你的详细视图控制器的委托。 如果你不想像这个例子那样需要访问视图控制器链,这将会很好的工作。 这是一个关于这个方法的教程 。 请注意“用细节连接大师”部分。

只是一个说明: 我testing切换UISplitViewControllers“displayMode”属性。 这个属性并没有给我足够的信息来弄清楚该怎么做。 原因是当你处于水平缩小模式和水平扩展模式时,属性被设置为.AllVisible。

最后,在我走之前。 我喜欢这样做的方式,因为很多次你知道你将需要一个UISplitViewController,所以你从模板创build一个项目。 你会注意到模板随着segue的设置而来。 这个模板非常适用于手机,但并不适用于iPad和iPhone6 +。 如果在创build项目后将UISplitViewController拖放到故事板上,您会注意到细节视图既不embeddedUINavigationController中,也不会从主框架中细分。 更多的设置我猜!

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

Interesting Posts