Come per molti di voi, ho bisogno di un 'modo modale' di utilizzare l'UISplitViewController. Questo sembra essere un vecchio problema, ma tutto ciò che ho trovato in StackOverflow era, nella migliore delle ipotesi, una spiegazione del perché il problema si verifica quando si tenta di farlo (come la risposta accettata sopra) o "hack-around".
Tuttavia, a volte non è molto comodo cambiare gran parte del codice base e rendere UISplitViewController l'oggetto iniziale solo per far funzionare la sua funzionalità.
A turno, c'è un modo per rendere tutti felici (comprese le linee guida Apple). La soluzione che ho trovato meglio, è stato quello di utilizzare l'UISplitViewController normalmente, ma quando necessario, per essere mostrato/respinto, utilizzare il seguente approccio:
-(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();
}
Dove "finestra", è una proprietà della vostra sottoclasse UISplitViewController. E il sistema si prenderà cura di tutto il resto!
Per comodità/di riferimento, ho caricato questo come una sottoclasse UISplitViewController a GitHub:
ModalSplitViewController
--EXAMPLE su come utilizzare -
mySplitViewController = [[ModalSplitViewController alloc] init];
mySplitViewController.delegate = self;
[mySplitViewController presentWithMasterViewController:masterViewController andDetailViewController:detailViewController completion:nil];
// when done:
[mySplitViewController dismissViewControllerWithCompletion:nil];
mySplitViewController = nil;
Side-nota: Credo la maggior parte della confusione deriva dal fatto che l'esempio di utilizzo di UISplitView dalla documentazione Apple utilizza la finestra creata nell'appDelegate e per il fatto che molte persone non sono così familiare con il concetto di finestra - perché di solito non abbiamo bisogno di (vengono creati una volta in StoryBoards o nel codice boilerplate).
Inoltre, se si sta eseguendo il ripristino dello stato, non si dovrebbe dimenticare che UIViewControllers creato in modo programmatico non verrà ripristinato automaticamente dal sistema. .
alternativa è quella di cercare un controllore aftermarket SplitView per le dimensioni, come https://github.com/SlavaBushtruk/APSplitViewController –
upvoted a "vista del regolatore aftermarket" –