Segue per un altro storyboard?


133

È possibile passare da uno storyboard all'altro o incorporare uno storyboard in un controller di visualizzazione in un altro storyboard? Devo inserire a UITabBarControllerin a UINavigationControllere mi piacerebbe mantenerli belli e separati.


1
Guardate questa risposta stackoverflow.com/a/19702425/317928
vokilam

5
Ottima domanda Avere uno storyboard è un incubo per progetti basati su team. Suddividiamo regolarmente i progetti in storyboard per "flusso" (uno storyboard per l'accesso, uno storyboard per feed di notizie e schermate correlate, ecc.). Aiuta a ridurre al minimo il numero di conflitti di unione, che altrimenti si verificherebbero ogni volta che uno sviluppatore tocca lo storyboard.
Brian Sachetta,

@BrianSachetta Cos'altro fai? Altri buoni consigli simili da condividere?
Miele

Dipende dalla struttura del tuo team. Se lo volessi davvero, potresti avere tutte le tue interfacce utente in file .xib separati. Ecco come esisteva prima che esistessero gli storyboard. Ci sono aspetti positivi e negativi di questo approccio. Il lato positivo è che non avrai quasi mai conflitti con altri sviluppatori nel progetto. Il rovescio della medaglia è che può essere difficile vedere visivamente il flusso dell'app.
Brian Sachetta,

Risposte:


201

Sì, ma devi farlo a livello di codice:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];

11
Voglio solo mantenere separati gli storyboard; sono già troppo ingombra.
Ry-

11
Proprio come i capitoli di un libro, vedo la necessità di più storyboard.
finneycanhelp,

48
Quando hai più sviluppatori che lavorano sulla stessa applicazione, diventa molto utile avere più storyboard perché a volte risolvere i conflitti di controllo versione nello storyboard xml è abbastanza doloroso.
Lee,

14
In iOS 9 e Xcode 7, sono ora supportati i riferimenti cross-storyboard. :-)
Quinn Taylor,

1
Vedi la risposta di milczi, puoi farlo ora facilmente nell'interfaccia utente!
Tim

117

Da Xcode 7 in poi, puoi farlo graficamente usando uno Storyboard Reference:

riferimento

Aggiungi riferimento allo storyboard allo storyboard. Crea segue tra ViewController e Storyboard Reference (ctrl + trascina)

Quindi riempire questi campi.

inserisci qui la descrizione dell'immagine

Dove "Tutorial" è il file "Tutorial.storyboard" e "MainTutorialController" è il campo "ID storyboard" in ViewControllerSettings


1
Buone informazioni, tuttavia la domanda è taggata iOS5, quindi non si applica.
Lnafziger,

10
@Inafziger sì, ma questa domanda appare nella parte superiore dei risultati di ricerca per le persone che usano iOS 9
Brian Ogden

Questo è disponibile da XCode 7 in poi. Maggiori informazioni su stackoverflow.com/questions/30772145/…
Simon Pickup,

Ha funzionato, ma devo anche mantenere la barra di navigazione, viene visualizzata senza la barra di navigazione, esiste un modo per mantenere una navigazione e un pulsante per tornare alla cronologia, non importa da quale storyboard provenga?
Gil Beyruth,

Questo funziona per me in iOS 10. Ho notato che ho bisogno di un riferimento storyboard per segue e non riesco a connettere più follower a un punto di riferimento.
Mark Reid

10

Non puoi davvero fare segues manualmente perché UIStoryboardSegue è una classe astratta. Devi sottoclassarlo e implementarlo performaffinché possa fare qualsiasi cosa. Sono davvero pensati per essere creati negli storyboard. Tuttavia, puoi spingere manualmente il controller di visualizzazione, che è una buona soluzione. La risposta di lnafziger lo fa bene:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

Una cosa da notare, tuttavia, è che hai detto che vuoi mantenere le cose belle e separate. L'idea degli storyboard è di permetterti di tenere le cose separate mentre fai tutto il tuo lavoro di progettazione in un unico posto. Ogni controller di visualizzazione è bello e separato dallo storyboard dagli altri. L'idea è di tenere tutto in un unico posto. Disporlo bene in modo che sia organizzato, e sarai a posto. Non dovresti separarlo a meno che tu non abbia davvero una buona ragione per farlo.


6
la fusione degli storyboard non funziona molto bene, quindi in un ambiente multi-sviluppatore, potrebbe essere interessante utilizzare storyboard separati. Inoltre, le prestazioni possono peggiorare nei grandi progetti con un singolo storyboard.
calimarkus,

1
Usiamo più storyboard, ma il punto è che non puoi davvero farlo e segue tra loro. Apple lo ha progettato in modo da poter fare tutto in un unico posto, quindi l'idea è di usarne solo uno (non che non puoi). Le prestazioni non dovrebbero essere un problema. Lo storyboard viene compilato in file pennino separati per ciascun controller di visualizzazione. Dovresti ottenere ottime prestazioni dagli storyboard. Le prestazioni saranno buone come se avessi xib separati per ogni controller di visualizzazione.
wbyoung,

3
Nel mio caso, il problema di prestazioni è di solito in Xcode ... L'attuale implementazione di Apple dell'editor dello storyboard è debole.
Adam,

1
Uno storyboard di 60 scene impiega 13 secondi per aprirsi su un Mac Pro 2014. Ho presentato un radar.
Robert Atkins,

7

Non inserire UITabBarController in un UINavigationController. Chiede bug come autorotazione / scarico della vista errati ecc., Poiché Apple non supporta questo tipo di contenimento:

Quando si combinano i controller di visualizzazione, tuttavia, l'ordine di contenimento è importante; sono valide solo alcune disposizioni. L'ordine di contenimento, da figlio a genitore, è il seguente:

  • Controller di visualizzazione del contenuto e controller di visualizzazione del contenitore con limiti flessibili (come il controller di visualizzazione della pagina)
  • Controller della vista di navigazione
  • Controller barra delle schede
  • Controller vista divisa

1
Sono totalmente d'accordo, e per molteplici ragioni. Inserire un TabBarController all'interno di un NavigationController non è una buona idea, perché i delegati non si attiverebbero correttamente per le viste contenute al loro interno e l'utente finale avrà un periodo terribile nella navigazione dell'interfaccia. Avrebbero difficoltà a tornare al controller che conduce fuori dall'interfaccia TabBar / Navigation. Al contrario, è OK, un NavigationController all'interno di un TabBarController. È sempre meglio non confondere l'utente finale e ascoltare i suggerimenti sulle mele!
Hubert Kunnemeyer,

1
Eppure l'app nativa per iPhone Music fa esattamente questo (parte "In riproduzione").
Enzo Tran,

Cordiali saluti: l'app di musica per iPhone non ha TabbarController nella schermata "In riproduzione".
sanjana,

4

Ecco una versione rapida:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}

-1

hai provato quanto segue:

2 / fare clic per selezionare il controller di visualizzazione collegato al controller di navigazione e nel menu principale: editor -> incorpora -> Controller barra delle schede

Nota: non l'ho provato perché sto usando il contrario: creare app con barra a schede e inserire il controller di navigazione).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.