Al igual que para muchos de ustedes, que necesitaba una 'forma modal' utilizar el UISplitViewController. Esto parece ser un problema antiguo, pero todo lo que encontré en StackOverflow fue, en el mejor de los casos, una explicación de por qué el problema ocurre cuando intentas hacerlo (como la respuesta aceptada anteriormente) o "hack-arounds".
Sin embargo, a veces tampoco es muy conveniente cambiar gran parte de su base de código y hacer que UISplitViewController sea el objeto inicial solo para que su funcionalidad esté en funcionamiento.
En efecto, hay una manera de hacer felices a todos (incluidas las pautas de Apple). La solución que mejor que encontré, era utilizar el UISplitViewController normalmente, pero cuando es necesario para ser mostrado/despedidos, utilice el siguiente enfoque:
-(void)presentWithMasterViewController: (UIViewController *) thisMasterViewController
andDetailViewController: (UIViewController *) thisDetailViewController
completion:(void(^)(void))completion
{
masterViewController = thisMasterViewController;
detailViewController = thisDetailViewController;
[self setViewControllers:[NSArray arrayWithObjects:masterViewController, detailViewController, nil]];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
self.window.rootViewController = self;
[self.window makeKeyAndVisible];
if(completion)
completion();
}
-(void)dismissViewControllerWithCompletion:(void (^)(void))completion
{
self.window = nil;
masterViewController = nil;
detailViewController = nil;
if(completion)
completion();
}
Donde "ventana", es una propiedad de la subclase UISplitViewController. ¡Y el sistema se encargará del resto!
Para mayor comodidad/de referencia, he subido esto como una subclase UISplitViewController a GitHub:
ModalSplitViewController
--example EN MODO DE EMPLEO -
mySplitViewController = [[ModalSplitViewController alloc] init];
mySplitViewController.delegate = self;
[mySplitViewController presentWithMasterViewController:masterViewController andDetailViewController:detailViewController completion:nil];
// when done:
[mySplitViewController dismissViewControllerWithCompletion:nil];
mySplitViewController = nil;
Side-nota: supongo la mayor parte de la confusión proviene del hecho de que el ejemplo de uso UISplitView de la documentación de Apple usa la ventana creada en la aplicaciónDelegate, y por el hecho de que la mayoría de las personas no están tan familiarizado con el concepto de ventana, porque normalmente no necesitamos para (se crean una vez en StoryBoards o en un código repetitivo).
Además, si está restaurando el estado, no debe olvidar que el sistema no restaura automáticamente los UIViewControllers creados mediante programación. El sistema no restaurará automáticamente .
una alternativa es tratar un controlador del mercado de accesorios SplitView en el tamaño, tales como https://github.com/SlavaBushtruk/APSplitViewController –
upvoted para "controlador de vista del mercado de accesorios" –