2014-10-13 10 views
6

Sto lavorando con un'app che utilizza uno UISplitViewController come radice della finestra. Vorrei che i controller di visualizzazione principale e di dettaglio fossero uno UITableViewController all'interno di uno UINavigationController, con lo UIToolbar visibile. In una larghezza orizzontale dimensioni regolari, questo funziona bene, come mostrato:iOS8 UIToolbar che scompare quando si visualizza il controller della vista di dettaglio

iPad 2

Il problema è in una classe orizzontalmente dimensioni compatte, dove il UISplitViewController sta spingendo il controllore visione dettagliata in uno stack come un UINavigationController, la la barra degli strumenti scompare quando viene mostrato il dettaglio, e riappare dopo che il dettaglio è completamente spuntato (vedi sotto). Mi piacerebbe che la barra degli strumenti rimanga sul posto come fa con un normale controller di navigazione.

enter image description here

progetto di esempio caricato here.

risposta

6

Per questa implementazione iniziale, Apple ha scelto di nascondere la barra degli strumenti del master, poiché il controller di navigazione (principale) non può utilizzare una singola barra degli strumenti per essere entrambi sullo schermo e scorrere (elementi diversi) sullo schermo. Se guardi l'app di posta di Apple, la loro barra degli strumenti principale scompare durante l'animazione push, proprio come stai vedendo.

È interessante notare che l'app Calendario utilizza una barra degli strumenti veramente interessante crossFade tra le transizioni di giorno e eventi. Se guardi quell'animazione, puoi vedere che si tratta di una singola barra degli strumenti per entrambe le viste, invece di una seconda barra degli strumenti che si anima sopra la prima.

Sebbene crossFade sia supportato privatamente da UINavigationController, Apple non lo abilita per questa particolare animazione del controller di visualizzazione. _shouldCrossFadeBottomBars restituisce NO e nessun setter per il flag del controller di navigazione delegateShouldCrossFadeBottomBars.

Presenterei una segnalazione di errore insieme a una richiesta di miglioramento per supportare l'animazione della barra di fondo per uno storyboard unificato UISplitViewController. Credo che Apple migliorerà la funzionalità del controller della vista split dell'iPhone.

Nel frattempo, è possibile gestirlo nascondendo la barra degli strumenti del controller di navigazione principale e aggiungere una barra degli strumenti allo storyboard del controller della vista principale. Ciò consentirà di visualizzare sullo schermo la barra degli strumenti del controller della vista principale, mentre gli elementi della barra degli strumenti del controller della vista di dettaglio si apriranno.

Ciò comporterà la modifica del master UITableViewController in un UIViewController. Aggiungi un UIToolbar e vincoli. Per la tabella, è possibile inserire un numero UITableView oppure utilizzare una vista Contenitore e collegarla al numero UITableviewController.

Imposta la barra degli strumenti della vista dettagli in DetailViewController.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Do any additional setup after loading the view, typically from a nib. 

    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] init ...]; 
    self.toolbarItems = @[barButtonItem]; 

    [self configureView]; 
} 

Il controller di navigazione avrà la configurazione degli elementi di barra (dopo la vista è stato caricato ma) prima della visualizzazione della vista, e la barra viene spinta sullo schermo insieme alla vista di dettaglio.

Se sei curioso, ecco cosa ho capito di fare con la barra degli strumenti della vista di dettaglio per la classe di dimensioni orizzontalmente compatta. È il controller di navigazione secondario, non, il controller della vista dettagli, che viene inserito nello stack del controller di navigazione principale.Il controller di navigazione principale preleva la decorazione dal controller di navigazione secondario, insieme allo navigationItems (e allo toolbarItems) che appartiene al suo controller di visualizzazione visibile (dettagli).

Sfortunatamente, l'inganno dietro le quinte per comprimere il controller secondario (di navigazione) della vista divisa influisce sulla barra degli strumenti, perché il controller di navigazione principale ha preso il sopravvento su ciò che il controller di navigazione secondario stava gestendo.

Tutto ciò che è stato fatto è spostare la barra degli strumenti secondaria dal controller di navigazione secondario al controller di visualizzazione dettagli, in modo che il controller di navigazione principale possa gestire l'animazione della barra degli strumenti del controller di visualizzazione dettagli quando viene premuto il controller di navigazione secondario.

Forse in un aggiornamento futuro, il controller della vista divisa sarà in grado di animare la barra degli strumenti dello storyboard, ma per ora, l'unico modo in cui so come farlo è nel codice.

+0

Molto bella spiegazione; chiaro, profondo. "È il controller di navigazione secondario, non il controller di visualizzazione dettagli, che viene inserito nello stack del controller di navigazione principale." Corretta. Ho commentato questo, con una certa sorpresa che funzioni a tutti, qui: https://devforums.apple.com/message/1056959#1056959 Risposta utile da un membro di Apple lì. – matt

+0

Forse, ma dovrei tornare indietro e capirlo. In questo momento voglio solo passare la prima bozza! Se sai come farlo, potresti creare un progetto di esempio su github che posso rubare da ...? :) – matt

+1

Wow. Questa è certamente un'omissione della documentazione. Potrebbero aver parlato di questo in uno dei tanti video del WWDC 2014 relativi all'adattamento ...! Ovviamente non hanno mai detto nulla su questo, eppure si rivela cruciale: http://stackoverflow.com/a/26591842/341994 – matt

3

Se è necessario utilizzare l'Applicazione dettagli principale senza modificare i controller di visualizzazione predefiniti e si è certi che la barra degli strumenti scompaia quando si preme il controller Vista dettagli ... è possibile aggiungere la seguente riga di codice alla Vista master Controller in viewWillAppear in modo che quando si apre, la barra degli strumenti sia presente durante i passaggi, non in attesa di essere visualizzata fino a quando non viene eseguito il follow.

self.navigationController?.setToolbarHidden(false, animated: true) 

Naturalmente è possibile eliminare la tabella View Controller di default e utilizzare un View Controller standard con una vista tabella in esso e aggiungere una barra degli strumenti, quindi non hanno il problema. Rompe una riga di codice poiché non è più in un controller di visualizzazione tabella e un controller di navigazione standard non supporta clearsSelectionOnViewWillAppear.

tableView.clearsSelectionOnViewWillAppear = self.splitViewController!.collapsed 

È possibile risolvere che aggiungendo questo codice al tuo viewWillAppear ...

 if let indexPath = tableView.indexPathForSelectedRow { 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    }