Swift: ¿cómo detectar si UISplitViewController actualmente muestra 1 o 2 controlleres?

¿Cómo puedo detectar si el UISplitViewController actualmente muestra solo 1 controller de vista o está en panel dual con 2 controlleres de visualización mostrados uno al lado del otro?

Aquí hay un caso simple:

Estás en MasterViewController y seleccionas una celda. Ahora, dependiendo de si UISplitViewController está queuepsado o no, desea realizar una segue (con un círculo en rojo)

Segue para realizar

a DetailViewController (contraído) o actualice DetailViewController (no se contraiga).

En su método "didSelectRowAtIndexPath" en su MasterViewController obtenga una reference al UISplitViewController y elija qué hacer así:

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

Si no desea utilizar la propiedad "queuepsada" del UISplitViewController, puede verificar el número de propiedad de controlleres de vista como este.

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

Otra opción es configurar la delegación desde su controller de vista maestra a su controller de vista de detalles. Esto funcionará bien si no desea tener que llegar a la cadena del controller de vista como lo hace este ejemplo. Aquí hay un tutorial sobre este método . Tenga en count la sección "Conexión del maestro con el detalle".

Solo una nota: probé la conmutación de la propiedad "displayMode" de UISplitViewControllers. Esta propiedad no me proporcionó información suficiente para saber qué hacer. La razón es que la propiedad está establecida en .AllVisible cuando se encuentra en modo compacto horizontal y en modo expandido horizontal.

Por último, antes de irme. Me gusta cómo lo hago porque muchas veces sabes que necesitarás un UISplitViewController para que puedas crear un proyecto a partir de la plantilla. Notarás que la plantilla viene con la configuration segue. Esta plantilla es ideal para teléfonos, pero no la recorta para iPads y iPhone6 ​​+. Si arrastra y suelta un UISplitViewController en un tablero de historia después de la creación del proyecto, notará que la vista de detalle no está incrustada en un UINavigationController ni hay una segue desde el maestro hasta el detalle. Simplemente más para configurar, supongo.

El controller de vista dividida refleja el modo de visualización real en la propiedad displayMode :

AllVisible : los UIViewControllers primario y secundario se muestran uno al lado del otro.

PrimaryHidden : el primario UISplitViewController está oculto.

PrimaryOverlay : el primario UISplitViewController superpone el secundario, que es parcialmente visible.

Cuando la propiedad isCollapsed es verdadera , se ignora el valor de la propiedad displayMode . Una interfaz de vista dividida contraída contiene solo un controller de vista, por lo que el modo de visualización es superfluo.


Reanudar : para averiguar la situación detallada en la pantalla, use la propiedad isCollapsed y (si es Collapsed = false) la propiedad displayMode .

Hay una propiedad de UISplitViewController denominada 'queuepsada'.