Visualizzazioni personalizzate con Storyboard


96

Negli schermi complessi (View Controller) ho usato per separare il tutto in pezzi più piccoli (li chiamo widget). Questi widget consistono fondamentalmente in MyWidget.hun MyWidget.mfile e oltre che in un MyWidget.xibfile, dove l'elemento radice è a UIViewe la classe MyWidget è il proprietario del file di UIView. Nell'init di questo widget faccio un file loadNibNamed.

Nel mio View Controller eseguo quindi una [[MyWidget alloc] init], che aggiungo alla vista principale del View's Controller come vista secondaria. Questo, finora, funziona perfettamente.

Ora mi chiedo come fare lo stesso con lo storyboard, perché non posso davvero iniziare a trascinare da UIViewqualche parte, devo sempre iniziare con un UIViewController, che non voglio.

Se non è possibile farlo con uno Storyboard, posso farlo semplicemente alla vecchia maniera, utilizzando lo Storyboard per le mie schermate e seguiti principali e utilizzare un file .xib separato per definire le visualizzazioni personalizzate?


Desideri creare xibi messaggi per i tuoi controller di visualizzazione separatamente e non nello storyboard?
TipycalFlow

Hai trovato una soluzione a questo?
aryaxt

@aryaxt: sto usando una miscela di Storyboard e xib's. Storyboard per le schermate principali e xib con solo una UIView come radice per visualizzazioni o widget complessi. Quindi non proprio una risposta alla mia domanda originale (usando lo storyboard), ma fondamentalmente facendo la stessa cosa che ho già fatto prima.
znq

in questi giorni, basta usare una vista del contenitore , è davvero così semplice .. stackoverflow.com/questions/23399061/...
Fattie

Risposte:


189

Mettere il widget / la vista in un file .xib separato funziona ed è appropriato soprattutto se si desidera fare riferimento alla stessa vista da più controller di visualizzazione.

Tuttavia, a volte vuoi vedere la vista / widget aggiuntivo all'interno dello stesso storyboard ed è possibile. Ecco come lo fai:

  1. Seleziona il tuo controller di visualizzazione in IB (fai clic sulla barra nera sotto la visualizzazione), quindi trascina una UIView dalla libreria degli oggetti nella barra nera:

    inserisci qui la descrizione dell'immagine

  2. Quando una vista si trova nella barra nera, viene istanziata come qualsiasi altra vista in IB, ma non viene aggiunta alla gerarchia della vista finché non lo si fa nel codice. Se necessario, modifica la classe della vista in modo che corrisponda alla tua sottoclasse:

    inserisci qui la descrizione dell'immagine

  3. Puoi collegarlo al controller della vista come faresti con qualsiasi altra vista: inserisci qui la descrizione dell'immagine

  4. La vista aggiunta viene visualizzata nella struttura del documento e puoi collegare azioni e riferimenti anche lì:

    inserisci qui la descrizione dell'immagine


Ora, il problema che rimane è che non puoi effettivamente vedere la vista, non importa quante volte provi a fare clic o doppio clic, il che vanificherebbe l'intero scopo di metterlo nello stesso storyboard. Fortunatamente ci sono due soluzioni alternative che conosco.

La prima soluzione alternativa è trascinare la vista dalla barra nera nella vista del controller della vista, modificarla, quindi trascinarla nuovamente nella barra nera una volta che hai finito. Questo è fastidioso ma affidabile.

L'altra soluzione alternativa è più complicata, ma la preferisco perché mi consente di vedere tutte le mie visualizzazioni contemporaneamente:

  1. Trascina un UITableView dalla libreria degli oggetti nella visualizzazione appena aggiunta.

  2. Quindi trascina un UITableViewCell in quel UITableView.

    inserisci qui la descrizione dell'immagine

  3. Una volta che lo fai, la tua vista si apre magicamente di lato, ma hai un UITableView che non vuoi. Puoi ridimensionarlo a 0x0 oppure eliminarlo e la tua UIView (di solito) rimarrà visibile.

  4. Occasionalmente la vista secondaria verrà nuovamente nascosta in IB. Puoi ripetere i passaggi precedenti se hai eliminato UITableView, o se UITableView è ancora nella gerarchia, devi solo fare clic su UITableViewCell e la vista apparirà di nuovo.

Il secondo metodo funziona per UIViews ma non così bene per UIToolbars ed è impossibile per UIButtons, quindi la soluzione più pulita che ho trovato quando è necessario includere molte sottoview diverse è allegare una singola UIView secondaria al controller della vista come un contenitore che non viene mai mostrato, inserisci tutte le tue visualizzazioni secondarie e usa il trucco UITableViewCell per rendere tutto visibile. Ridimensiono il mio UITableView fittizio a 0x0 per renderlo invisibile. Ecco uno screenshot di come sembra tutto insieme:

inserisci qui la descrizione dell'immagine


Marzo 2013, non avevo bisogno di farlo: dovresti ignorare completamente la barra nera e trascinare / rilasciare la tua vista direttamente nella vista principale, e funziona bene (Xcode 4.5+)
Adam

È possibile riutilizzare quell'uivew personalizzato sullo stesso ViewController - Se es. servivano due uivew personalizzate - E se è come?
Morten Gustafsson

2
Dang, preferisco creare solo un xib separato. Probabilmente non ricorderò tutto questo quando dovrò aggiornare l'app tra 6 mesi.
Sandy

Sebbene questa sia una risposta fantastica, ho accidentalmente trovato un altro modo migliore penso. Quando si collegano le prese ai componenti della visualizzazione effettiva. Se passi il mouse un po 'su un componente di tale vista interna, si apre per una selezione più semplice. Poi lo vedi sullo storyboard ...
Oded Ben Dov

7
Sebbene questa sia una risposta storica incredibilmente ammirevole, in realtà ora è totalmente obsoleta. Apple ha risolto l'intero problema introducendo le "visualizzazioni contenitore", che ora è la cosa centrale e fondamentale da fare quando si creano app: tutto è sempre una "visualizzazione contenitore". Grazie al cielo, ora è molto facile!
Fattie

11

Se stai solo cercando di rendere i tuoi controller di visualizzazione altrove (e non nel tuo storyboard), allora c'è un modo piuttosto semplice per farlo:

1) Crea i tuoi CustomViewController( abcdControllernel codice che ho provato) con i loro singoli xibcome al solito.

2) Aggiungi una UIViewController(o qualunque cosa fosse la tua superclasse CustomViewController) allo storyboard.

3) Imposta CustomClass su CustomViewControllerinvece di UIViewControllercome mostrato qui:

inserisci qui la descrizione dell'immagine

4) Infine, nel tuo viewDidLoad, carica il custom xibe il gioco è fatto.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}

3
Grazie per la tua risposta molto dettagliata, ma in realtà non sto cercando un controller di visualizzazione personalizzato, ma una visualizzazione personalizzata (un widget), che viene aggiunta a un UIViewController standard. Quindi il controller di visualizzazione non è il problema, ma mi chiedevo quale fosse l'approccio migliore per creare widget personalizzati. O A) fallo come ho fatto prima, con un file .xib o B) qualche altro approccio che non conosco ancora :-)
znq

1
Hmm ... Penso di avere quello che vuoi. Fondamentalmente vuoi gestire più visualizzazioni con lo stesso controller, giusto? Non riesco a pensare a un modo diverso da loadNibNamedquel caso ... XO
tipycalFlow

Questo ha risolto questo problema per me: stackoverflow.com/questions/11047991/… Tuttavia, invece di viewDidLoad, ho usato loadView ...
Morkrom

1
Giusto per ripetere, questo è tutto (per fortuna!) Totalmente obsoleto ora che le visualizzazioni del contenitore sono qui. Basta fare clic su una visualizzazione contenitore ed è tutto fatto
Fattie

1

Penso che tu possa fare qualcosa di simile per ottenere un'istanza di un viewcontroller specifico da Storyboard e utilizzare la vista sopra di esso.

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

Spero che questo ti aiuti

Grazie Vijay

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.