ios uisplitviewcontroller

iOS-Split View Controller-¿Cómo obtengo un puntero(referencia) al Detail View Controller desde el interior del Master View Controller?



uisplitviewcontroller (2)

Cree una propiedad en su subclase UISplitViewController:

var _detailViewController: UIViewController? { get { if viewControllers.count > 1 { return viewControllers[1] as? UIViewController } return nil } }

Según la documentación de Apple, a veces esto debería devolver nil, pero en mi experiencia, siempre devuelve el controlador de vista de detalle, independientemente del estado.

Además, no llame a esta propiedad "detailViewController" en lugar de "_detailViewController". Aparentemente, Apple ya está usando ese nombre debajo del capó, y afectará a su interfaz de usuario.

UISplitViewController es realmente malo y necesita una gran cantidad de limpieza y documentación corregida ...

iOS - Controlador de vista dividida: ¿Cómo obtengo un puntero (referencia) al Controlador de vista detallada (el más grande a la derecha) desde el Controlador de vista maestro (el más pequeño a la izquierda)?

Mi instinto me dice que el controlador principal de vista dividida debe tener una referencia al controlador de vista detallada y a mi propio controlador de vista maestra, pero no puedo averiguar cómo obtenerlo.

¿Alguna idea?


Los controladores de vista dividida tienen referencias a sus controladores de vista maestra y de detalle, a través de la propiedad viewControllers .

En iOS viewControllers continuación, la matriz viewControllers debe tener exactamente dos objetos de controlador de vista en ella. El primer objeto es el controlador de vista maestro y el segundo objeto es el controlador de vista de detalle.

En iOS 8.0 y superior, la matriz viewControllers tiene al menos un objeto de controlador de vista en él: el controlador de vista maestro (o "primario"). Si hay un segundo objeto de controlador de vista en la matriz, entonces es el controlador de vista de detalle (o "secundario"). Cuando el controlador de vista dividida está contraído, solo el controlador de vista maestro está en esta matriz, y cuando se expande contendrá tanto el controlador de vista maestro como el de vista detallada.

Puede usar la propiedad splitViewController de todos los controladores de vista para obtener su controlador de vista dividida, y desde allí usar la propiedad viewControllers para acceder a sus controladores de vista maestro o de vista de detalle, de esta manera:

Rápido:

let masterVC = self.splitViewController?.viewControllers.first let detailVC = (self.splitViewController?.viewControllers.count > 1) ? self.splitViewController?.viewControllers[1] : nil

C objetivo:

UIViewController *masterVC = [self.splitViewController.viewControllers firstObject]; UIViewController *detailVC; if (self.splitViewController.viewControllers.count > 1) { detailVC = self.splitViewController.viewControllers[1]; }

La propiedad splitViewController funciona al subir la jerarquía del controlador de vista e intentar encontrar cualquier controlador de vista dividida en el que se encuentre el controlador de vista llamante. Si el controlador de vista no está en un controlador de vista dividida, entonces la propiedad es nil . Funciona de la misma manera que las propiedades del controlador de navigationController y tabBarController .

Puede hacer que sea más fácil acceder a los controladores de vista de detalle y maestro usando una extensión en Swift (o una categoría en Objective-C) en UISplitViewController , así (sustituyendo todos los xx_ ''s con su propio prefijo si está usando Objective-C ):

Rápido:

extension UISplitViewController { var primaryViewController: UIViewController? { return self.viewControllers.first } var secondaryViewController: UIViewController? { return self.viewControllers.count > 1 ? self.viewControllers[1] : nil } }

C objetivo:

// UISplitViewController+ChildViewControllerAccess.h @interface UISplitViewController (ChildViewControllerAccess) @property (nonatomic, readonly) UIViewController *xx_primaryViewController; @property (nonatomic, readonly) UIViewController *xx_secondaryViewController; @end // UISplitViewController+ChildViewControllerAccess.m @implementation UISplitViewController (ChildViewControllerAccess) - (UIViewController *)xx_primaryViewController { return self.viewControllers.firstObject; } - (UIViewController *)xx_secondaryViewController { return self.viewControllers.count > 1 ? self.viewControllers[1] : nil; } @end

Entonces puedes hacer uso de estas propiedades así:

Rápido:

func someFunctionInSomeViewControllerClass { // Get the primary and secondary view controllers if // this view controller is in a split view controller. // These will be nil if this view controller is not a // descendant of a split view controller. var primaryVC = self.splitViewController?.primaryViewController var secondaryVC = self.splitViewController?.secondaryViewController // Do something with them primaryVC?.title = "This is the primary VC" secondaryVC?.title = "This is the secondary VC" }

C objetivo:

#import "UISplitViewController+ChildViewControllerAccess.h" [...] - (void)someMethodInSomeViewControllerClass { // Get the primary and secondary view controllers if // this view controller is in a split view controller. // These will be nil if this view controller is not a // descendant of a split view controller. UIViewController *primaryVC = self.splitViewController.xx_primaryViewController; UIViewController *secondaryVC = self.splitViewController.xx_secondaryViewController; // Do something with them primaryVC.title = @"This is the primary VC"; secondaryVC.title = @"This is the secondary VC"; }