Aggiornamento 1/12/2016 : è il 2016 e preferisco ancora impostare le mie UI nel codice e non negli Storyboard. Detto questo, gli storyboard hanno fatto molta strada. Ho rimosso tutti i punti da questo post che semplicemente non si applicano più nel 2016.
Aggiornamento 24/04/2015 : È interessante notare che Apple non usa nemmeno gli Storyboard nel suo ResearchKit di recente provenienza, come ha notato Peter Steinberger (sotto il sottotitolo "Interface Builder").
Aggiornamento del 6/10/2014 : come previsto, Apple continua a migliorare Storyboard e Xcode. Alcuni dei punti applicati a iOS 7 e versioni precedenti non si applicano più a iOS 8 (e ora sono contrassegnati come tali). Quindi, sebbene gli Storyboard abbiano intrinsecamente ancora difetti, rivedo il mio consiglio di non usare per usare selettivamente dove ha senso .
Anche ora che iOS 9 è uscito, lo consiglierei controprestare attenzione quando si decide se utilizzare gli storyboard. Ecco i miei motivi:
Gli storyboard falliscono in fase di esecuzione, non in fase di compilazione : hai un errore di battitura in un nome seguito o lo hai collegato in modo errato nello storyboard? Si esploderà in fase di esecuzione. Utilizzi una sottoclasse UIViewController personalizzata che non esiste più nello storyboard? Si esploderà in fase di esecuzione. Se fai queste cose nel codice, le prenderai presto, durante la compilazione. Aggiornamento : il mio nuovo strumento StoryboardLint risolve principalmente questo problema.
Gli storyboard diventano rapidamente confusi : man mano che il progetto cresce, lo storyboard diventa sempre più difficile da navigare. Inoltre, se più controller di visualizzazione hanno più follower su più altri controller di visualizzazione, lo storyboard inizia rapidamente a sembrare una scodella di spaghetti e ti ritroverai a zoomare avanti e indietro e scorrere ovunque per trovare il controller di vista che stai cercando per e per scoprire cosa segue punti dove. Aggiornamento : questo problema può essere risolto principalmente dividendo lo Storyboard in più Storyboard, come descritto in questo articolo di Pilky e in questo articolo di Robert Brown .
Gli storyboard rendono il lavoro in gruppo più difficile : poiché di solito hai solo un enorme file di storyboard per il tuo progetto, avere più sviluppatori che apportano regolarmente modifiche a quel file può essere un mal di testa: le modifiche devono essere unite e i conflitti risolti. Quando si verifica un conflitto, è difficile dire come risolverlo: Xcode genera il file XML dello storyboard e non è stato realmente progettato con l'obiettivo in mente che un essere umano dovrebbe leggere, figuriamoci modificarlo.
Gli storyboard rendono le revisioni del codice difficili o quasi impossibili : le revisioni dei codici peer sono un'ottima cosa da fare per il tuo team. Tuttavia, quando si apportano modifiche a uno storyboard, è quasi impossibile rivedere queste modifiche con uno sviluppatore diverso. Tutto ciò che puoi estrarre è una diff di un enorme file XML. Decifrare ciò che è realmente cambiato e se quei cambiamenti sono corretti o se hanno rotto qualcosa è davvero difficile.
Gli storyboard ostacolano il riutilizzo del codice : nei miei progetti iOS, di solito creo una classe che contiene tutti i colori, i caratteri, i margini e gli inserti che utilizzo in tutta l'app per dargli un aspetto coerente: è un cambio di una riga se devo regola uno di questi valori per l'intera app. Se imposti tali valori nello storyboard, li duplichi e dovrai trovare ogni singola occorrenza quando vuoi cambiarli. È molto probabile che tu ne perda uno, perché non c'è ricerca e sostituzione negli storyboard.
Gli storyboard richiedono costanti cambi di contesto : mi trovo a lavorare e navigare molto più velocemente nel codice che negli storyboard. Quando la tua app utilizza gli storyboard, cambi continuamente contesto: "Oh, voglio un tocco su questa cella di visualizzazione tabella per caricare un controller di visualizzazione diverso. Ora devo aprire lo storyboard, trovare il controller di visualizzazione giusto, creare un nuovo seguito all'altro controller di visualizzazione (che devo anche trovare), dai un nome ai seguaci, ricorda quel nome (non riesco a usare costanti o variabili negli storyboard), torna al codice e spero di non sbagliare a digitare il nome di che segue per il mio metodoifyForSegue. Come vorrei poter semplicemente digitare quelle 3 righe di codice proprio qui dove sono! " No, non è divertente. Il passaggio tra codice e storyboard (e tra tastiera e mouse) invecchia rapidamente e ti rallenta.
Gli storyboard sono difficili da refactoring : quando si esegue il refactoring del codice, è necessario assicurarsi che corrisponda ancora a ciò che si aspetta lo storyboard. Quando sposti le cose nello storyboard, scoprirai in fase di esecuzione solo se funziona ancora con il tuo codice. Mi sembra di dover sincronizzare due mondi. È fragile e scoraggia il cambiamento secondo la mia modesta opinione.
Gli storyboard sono meno flessibili : nel codice puoi praticamente fare tutto quello che vuoi! Con gli storyboard sei limitato a un sottoinsieme di ciò che puoi fare nel codice. Soprattutto quando vuoi fare alcune cose avanzate con animazioni e transizioni ti troverai a "combattere lo storyboard" per farlo funzionare.
Gli storyboard non ti consentono di cambiare il tipo di controller di visualizzazione speciali : vuoi cambiare a UITableViewController
in UICollectionViewController
? O in una pianura UIViewController
? Non è possibile in uno storyboard. Devi eliminare il vecchio controller di visualizzazione e crearne uno nuovo e riconnettere tutti i follower. È molto più semplice apportare una tale modifica al codice.
Gli storyboard aggiungono due ulteriori responsabilità al tuo progetto : (1) Lo strumento Editor storyboard che genera lo storyboard XML e (2) il componente runtime che analizza l'XML e crea l'interfaccia utente e gli oggetti controller da esso. Entrambe le parti possono contenere bug che non è possibile correggere.
Gli storyboard non ti consentono di aggiungere una sottoview aUIImageView
: Chissà perché.
Gli storyboard non ti consentono di abilitare il layout automatico per le singole viste (-Controller) : selezionando / deselezionando l'opzione Layout automatico in uno storyboard, la modifica viene applicata a TUTTI i controller nello storyboard. (Grazie a Sava Mazăre per questo punto!)
Gli storyboard hanno un rischio maggiore di interrompere la compatibilità all'indietro : Xcode a volte modifica il formato del file Storyboard e non garantisce in alcun modo che sarai in grado di aprire i file Storyboard che crei oggi tra qualche anno o addirittura mesi. (Grazie a Thoughtadvances per questo punto. Vedi il commento originale )
Gli storyboard possono rendere il codice più complesso : quando crei i controller di visualizzazione nel codice, puoi creare init
metodi personalizzati , ad esempio initWithCustomer:
. In questo modo, è possibile rendere customer
immutabile l' interno del controller della vista e assicurarsi che questo controller della vista non possa essere creato senza un customer
oggetto. Questo non è possibile quando si utilizzano gli storyboard. Dovrai attendere prepareForSegue:sender:
che venga chiamato il metodo, quindi dovrai impostare la customer
proprietà sul controller della vista, il che significa che devi rendere mutevole questa proprietà e dovrai consentire la creazione del controller della vista senza un customer
oggetto . Nella mia esperienza questo può complicare notevolmente il tuo codice e rendere più difficile ragionare sul flusso della tua app. Aggiornamento del 09/09/16: Chris Dzombak ha scritto un ottimo articolo su questo problema .
È McDonald's : per dirlo con le parole di Steve Jobs su Microsoft: è McDonald's (video) !
Questi sono i motivi per cui non mi piace davvero lavorare con gli storyboard. Alcuni di questi motivi si applicano anche agli XIB. Nei progetti basati su storyboard a cui ho lavorato, mi sono costati molto più tempo di quanto abbiano risparmiato e hanno reso le cose più complicate anziché più semplici.
Quando creo la mia interfaccia utente e il flusso di applicazioni nel codice, ho molto più controllo su ciò che sta accadendo, è più facile eseguire il debug, è più facile individuare errori in anticipo, è più facile spiegare le mie modifiche ad altri sviluppatori e è più facile supportare iPhone e iPad.
Tuttavia, sono d'accordo sul fatto che la disposizione dell'intera interfaccia utente nel codice potrebbe non essere una soluzione unica per tutti i progetti. Se l'interfaccia utente del tuo iPad differisce notevolmente dall'interfaccia utente del tuo iPhone in alcuni punti, potrebbe essere sensato creare un XIB solo per quelle aree.
Molti dei problemi descritti sopra potrebbero essere risolti da Apple e spero che sia quello che faranno.
Solo i miei due centesimi.
Aggiornamento : in Xcode 5, Apple ha tolto l'opzione per creare un progetto senza Storyboard. Ho scritto un piccolo script che porta i modelli di Xcode 4 (con l'opzione di opt-out per Storyboard) su Xcode 5: https://github.com/jfahrenkrug/Xcode4templates