ios - Abra UISplitViewController en la vista maestra en lugar de en el detalle
objective-c swift (4)
Tengo una interfaz de vista dividida con una aplicación de iPhone 6 de destino. En el primer lanzamiento de la aplicación, se abre a la Vista detallada; Me gustaría que se abra a la vista maestra. Yo he tratado:
self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryOverlay
Lo que se sugirió en otra parte (Pregunta anterior de StackOverFlow) pero no parece hacer nada, y no abre la vista Maestra al iniciar. También intenté agregar la siguiente línea a mi AppDelegate:
splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:
Pero a pesar de devolver verdadero o falso ( otra pregunta de desbordamiento de pila anterior ) no tuve éxito.
Puse en marcha la aplicación Master-Detail de ejemplo en Xcode, y se carga en la vista Master basada en el splitViewController: la llamada devuelve false; sin embargo, no estoy seguro de cómo hacer que esto funcione en un diseño más complicado.
En el primer lanzamiento de la aplicación, se abre a la Vista detallada; Me gustaría que se abra a la vista maestra
Suponiendo que desea eso solo en el primer lanzamiento, pero no siempre; por ejemplo, en el caso de que la Vista maestra muestre un conjunto de datos vacío; entonces la solución es tal como muestra la plantilla Maestro-Detalle:
func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController, ontoPrimaryViewController primaryViewController:UIViewController) -> Bool {
guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false }
guard let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController else { return false }
if topAsDetailController.detailItem == nil {
// Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
return true
}
return false
}
Rápido
UISplitViewController muestra la vista maestra sobre el detalle en la orientación vertical, no se trata de mostrar la vista maestra, se trata de presentar la vista detallada en todo su ancho, debajo de la vista maestra.
UISplitViewController en retrato en iPhone muestra detalles VC en lugar de maestro se refiere al principio del mecanismo de colapso.
Esta respuesta actual aborda:
- Master → Detalle (ancho compacto)
- iPhone 4s, 5, 5s, SE, 6, 6s, 7 (cualquier orientación)
- iPod Touch
- cualquier iPhone Plus (retrato)
- lado a lado (todos los demás tamaños)
- iPad
- cualquier iPhone Plus (paisaje)
Debe establecer preferredDisplayMode
. Usted querría es .primaryVisible
si existiera! Usando .allVisible
, iOS selecciona Detail
si solo se ajusta 1 vista (ancho compacto) ; en ese tamaño, el código de abajo elegirá Master
.
El truco es cambiar tanto el preferredDisplayMode
a .allVisible
como devolver true
en collapseSecondary:onto
.allVisible
.
class PrimarySplitViewController: UISplitViewController,
UISplitViewControllerDelegate {
override func viewDidLoad() {
self.delegate = self
self.preferredDisplayMode = .allVisible
}
func splitViewController(
_ splitViewController: UISplitViewController,
collapseSecondary secondaryViewController: UIViewController,
onto primaryViewController: UIViewController) -> Bool {
// Return true to prevent UIKit from applying its default behavior
return true
}
}
Esta es una pregunta antigua y ninguna de las respuestas fue para el Objetivo C, e incluso cuando transmití las respuestas Swift, ninguna funcionó para mí. Uno estuvo cerca, por @SwiftArchitect.
Pero recomendó configurar el modo de contenido en .allVisible
( UISplitViewControllerDisplayModeAllVisible
en Objective C): esto hace que la vista maestra se muestre todo el tiempo, dividiendo la vista en maestra por un lado y los detalles por el otro. Lo que es bastante bueno, pero el OP me pidió específicamente que mostrara la vista maestra en el lanzamiento inicial, que es lo que necesitaba hacer.
El cambio fue utilizar UISplitViewControllerDisplayModePrimaryOverlay
para el modo de visualización.
Esta respuesta es para Xcode 9.4.1, destino de implementación 11.4.
Aquí está MasterViewController.h - debe agregar UISplitViewControllerDelegate en la declaración de protocolos:
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
#import "MasterDetailDemo+CoreDataModel.h"
@class DetailViewController;
@interface MasterViewController : UITableViewController
<UISplitViewControllerDelegate,
NSFetchedResultsControllerDelegate>
@property (strong, nonatomic) DetailViewController *detailViewController;
@property (strong, nonatomic) NSFetchedResultsController<Event *> *fetchedResultsController;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@end
Y luego, en su MasterViewController.m, debe configurar el delegado del controlador de vista dividida y el modo de contenido en ViewDidLoad, y seguir junto con la respuesta de @ SwiftArchitect, para agregar también el método del delegado del controlador de vista dividida:
- (void)viewDidLoad {
[super viewDidLoad];
// needed to "slide out" MasterView on startup on iPad
self.splitViewController.delegate = self;
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
self.navigationItem.leftBarButtonItem = self.editButtonItem;
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
self.navigationItem.rightBarButtonItem = addButton;
self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
}
// split view delegate method
- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {
return true;
}
NOTA : Después de algunas pruebas, descubrí que el método de delegado de vista dividida y el protocolo de vista dividida no eran necesarios. Sin él, parece funcionar exactamente igual. Tal vez esto sea el resultado de cambios en iOS ya que la pregunta fue originalmente formulada y respondida.
Lo tengo funcionando bien simplemente poniendo esta línea en mi método ViewDidLoad:
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
Paso 1 - Abre MasterViewController
Paso 2 : asegúrese de que la vista de tabla tenga el protocolo UISplitViewControllerDelegate. P.ej:
class ListVC: UITableViewController,UISplitViewControllerDelegate {}
Paso 3 - Añadirlo en ViewDidLoad
splitViewController?.delegate = self
Paso 4 : luego anule este método para decir que el controlador de vista maestra siempre debe colapsar en el controlador de vista detallada:
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
return true
}