Sembra che si stia tentando di consentire alla vista del dettaglio di gestire il contrassegno come "vuoto".
Suggerirei di spostare quella logica sul controller della vista principale, in modo che possa gestire anche altri casi oltre alla rotazione, ad esempio quando arrivano nuovi risultati o l'utente cerca risultati (filtri).
Lascia che il controller della vista principale gestisca l'aggiornamento della vista di dettaglio (contrassegnando i suoi dettagli come nulli, o preferibilmente passandogli nuovi dettagli).
tua vista suddivisa controllore delegato sarà in grado di determinare come gestire il controller di vista secondario, e il codice di controllo dettagliata sarà anche più facile da mantenere, in quanto non hanno conoscenza o sia (strettamente) accoppiato a una fonte di dati.
Aggiornamento:
Non v'è alcun master-solo UISplitViewController
displayMode
dove il secondario non può essere mostrato. Le modalità di visualizzazione mostrano tutte il VC secondario, ma possono mostrare, nascondere o sovrapporre il VC primario. L'utente può ruotare il dispositivo, o visualizzare o nascondere il VC primario (tramite presentsWithGesture
o displayModeButtonItem
), ma il VC secondario verrà sempre visualizzato, vuoto o no, per una classe dimensionale normale.
Ecco come il codice del modello Dettagli principali di Apple determina se il VC secondario deve essere compresso o eliminato, quando il dispositivo passa a una classe di dimensioni orizzontalmente compatta.
- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {
if ([secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[YHWHDetailViewController class]] && ([(YHWHDetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil)) {
// Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
return YES;
} else {
return NO;
}
}
Nota che Apple utilizza una proprietà sul controller dettaglio vista come una bandiera.
ho capito si ritiene che la decisione se il VC secondario dovrebbe essere crollato o scartato dovrebbe essere basata sul fatto che l'utente ha respinto esplicitamente la VC secondario (mentre è crollato in una dimensione orizzontale compatta).
Capisco che si sta cercando di rendere dettaglio VC "chiaro" per sé quando scompare, ma assumendo che è stato respinto (scartato) e non si è in possesso di un forte riferimento ad essa, che sarebbe un non- operazione.
È più semplice se il dettaglio scompare (oppure lo dataSource
annulla i dettagli).
Se si sta tenendo su di esso, e non si può cancellare i dettagli, potrete sia necessario per:
- mantenere un po 'tipo di bandiera (se un oggetto BOOL o nullo) che riflette se il contenuto del dettaglio è stato reso "irrilevante" e si basa su tale flag per determinare in futuro se il controller della vista secondaria debba (ancora una volta) essere compresso o meno.
- Controllare il dettaglio (prima di richiuderlo di nuovo) contro
dataSource
per vedere se il contenuto è "rilevante" o "irrilevante".
Se si utilizza una proprietà VC di dettaglio come bandiera, ecco il vantaggio. Quando l'SVC è compresso, e il dettaglio VC è stato "espressamente chiuso", non c'è più un VC secondario da dividere dal VC primario.
- (UIViewController *)splitViewController:(UISplitViewController *)splitViewController
separateSecondaryViewControllerFromPrimaryViewController:(UIViewController *)primaryViewController{
if ([primaryViewController isKindOfClass:[UINavigationController class]]) {
for (UIViewController *controller in [(UINavigationController *)primaryViewController viewControllers]) {
if ([controller isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)controller visibleViewController] isKindOfClass:[DetailViewController class]]) {
return controller;
}
}
}
// No detail view present
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *secondaryViewController = [storyboard instantiateViewControllerWithIdentifier:@"SecondaryViewController"];
// Ensure back button is enabled
UIViewController *detailViewController = [secondaryViewController visibleViewController];
detailViewController.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
detailViewController.navigationItem.leftItemsSupplementBackButton = YES;
return secondaryViewController;
}
Perché si crea un'istanza di un dettaglio "vuoto" VC, quando l'utente ruota lo SVC ritorno da dimensioni regolari a dimensioni compatte, il delegato SVC può vedere che non ci sono dettagli da visualizzare, in modo di annullare il VC secondaria .
Questo è l'approccio di Apple, e funziona molto bene, perché lascia il controllo sul fatto che SVC sia compresso o espanso all'utente, tramite una rotazione, un gesto o il pulsante della modalità di visualizzazione.
Sono sicuro che hai visto l'app di posta Apple sul 6 Plus. Nota, però, di ciò che Apple fa una volta che l'utente ruota di nuovo a una classe dimensionale normale. Anche se l'utente torna all'elenco dei messaggi, il messaggio selezionato in precedenza viene comunque visualizzato quando ricompare il dettaglio.
Se è possibile rendere la vostra app si comporta anche in questo modo, lo incoraggerei. È amichevole, conveniente e gratificante, perché risparmia all'utente il tempo di dover effettuare una (ri) selezione e mostra dettagli invece di una vista vuota.
Un controller di visualizzazione master non sa se è di nuovo visualizzato perché un dettaglio View Controller viene eliminato (la classe di dimensioni Compact orizzontale, compresso) o perché un figlio di un dettaglio View Controller viene eliminato (le dimensioni orizzontali normali) classe, side-by-side). Pertanto, un master VC non può sapere quando contrassegnare un dettaglio VC come vuoto. Inoltre, questo tipo di soluzione creerebbe un accoppiamento stretto tra una particolare classe di un VC master con una particolare classe di un VC di dettaglio, che è probabilmente peggiore della conoscenza del livello del modello di dominio (un'origine dati). – Gary
Vedo il tuo punto, ma non sono d'accordo che "se un VC secondario dovrebbe essere [nascosto] o [cancellato] dipende dal fatto che il dettaglio abbia contenuti da mostrare". Nello stato compresso, l'attivazione e l'animazione del licenziamento secondario VC sono identiche al licenziamento VC non splitter, pertanto ritengo che dovrebbe sempre invalidare i contenuti VC secondari. *** Credo che un master VC e un dettaglio VC dovrebbero essere disaccoppiati: un VC master notifica un modello di dominio di una particolare condizione di filtraggio dei dati e un dettaglio VC viene notificato da un modello di dominio che deve essere aggiornato (nessun messaggio diretto tra un master VC e un dettaglio VC). – Gary
Grazie per il suggerimento, ma in caso di 'collapseSecondaryViewController: ontoPrimaryViewController:' è lo stesso problema di nuovo: il delegato non ha modo di sapere se un dettaglio VC è stato precedentemente espressamente rifiutato da un utente, o no, quindi non può mai decidere di nascondere il VC secondario. Voglio scartare SOLO contenuti VC secondari se è stato esplicitamente "abbandonato" da un utente, che non vuole vederlo più ed esplicitamente VAI INDIETRO ad un VC master. La rotazione da sola non dovrebbe mai influire sul contenuto (scartare). – Gary