Sono abbastanza nuovo per lo sviluppo Mac e sono un po 'confuso dalla nuova funzione "storyboard" in Xcode 6. Quello che sto cercando di fare è passare da un controller di visualizzazione a un altro nella stessa finestra. A partire da ora, tutte le diverse NSViewControllerSegues presentano il controller di visualizzazione in una nuova finestra, sia esso modale o solo un'altra finestra. Quello che mi piacerebbe fare è semplicemente seguire all'interno della stessa finestra, più o meno nello stesso modo in cui si farebbe su iOS (anche se una transizione animata non è cruciale). Come sarebbe stato realizzato?Come si può visualizzare un nuovo controller di visualizzazione nella stessa finestra Mac?
risposta
Se si fornisce un seguito personalizzato (sottoclasse di NSStoryboardSegue) è possibile ottenere il risultato desiderato. Ci sono alcuni grattacapi con questo approccio però:
- la segue personalizzato utilizzerà
presentViewController:animator
quindi sarà necessario fornire un oggetto animatore - perché la vista presentato non è sostenuta da un oggetto finestra separata, è potrebbe essere necessario fornirgli un NSView personalizzato solo per rilevare gli eventi del mouse che non vuoi propagare alla vista NSViewController sottostante
- c'è anche un problema tecnico solo per Swift relativo alla proprietà
identifier
dei seguiti personalizzati che devi controllare per .
Poiché non sembra esserci molta documentazione su questo ho creato uno small demo project con esempi di passaggi personalizzati in Swift e Objective-C.
ho anche hanno fornito qualche dettaglio in risposta alle this question.
(Rilanciare questo come si esce come primo risultato rilevante su Google e ho avuto lo stesso problema, ma ha deciso contro un segue personalizzato)
Mentre personalizzato sfocia lavoro (almeno, il codice indicato nella risposta della fonderia ha lavorato sotto Swift 3, necessita di un aggiornamento per Swift 4), la mole di lavoro necessaria per scrivere un animatore personalizzato mi suggerisce che il loro caso d'uso principale sono le animazioni personalizzate.
La soluzione semplice per modificare il contenuto di una finestra è creare un NSWindowController per la finestra e impostarne il contenutoViewController sul viewController desiderato. Ciò è particolarmente utile se si segue il tipico schema degli storyboard e si crea un'istanza di una nuova istanza ViewController ogni volta che si passa.
Tuttavia.
Il NSStoryboard documentation dice chiaramente in MacOS, contenimento (piuttosto che di transizione) è la nozione più comune per storyboard che mi hanno portato a rivedere gli strumenti a disposizione.
È possibile utilizzare una vista Contenitore per questa attività, che aggiunge un livello NWViewController al posto del NSWindowController descritto in precedenza. La soluzione che ho seguito è utilizzare NSTabViewController. Nell'ispettore attributi, impostare lo stile su "non specificato" , quindi selezionare TabView e impostare nello stile su "senza tabulazione".
Per modificare le schede in modo programmatico, impostare selectedTabViewItemIndex
di TabViewController.
Questa soluzione riutilizza la stessa istanza di ViewControllers per il contenuto della scheda, in modo che tutti i dati immessi nei campi di testo vengano conservati quando l'utente passa all'altra "scheda".
L'esempio di progetto fornito su GitHub è incredibilmente utile! Cercare di adattarmi dallo sviluppo iOS allo sviluppo di macOS non è stato facile per me, quindi grazie mille per il codice. Una domanda, come si può fare un'animazione del controller di visualizzazione push su macOS? (Come l'app macOS Tweetbot). – Supertecnoboff