2012-01-12 10 views
7

SfondoUtilizzo di più file pennino con un controller a vista singola?

sto usando Interface Builder per creare l'interfaccia utente per un app su cui sto lavorando. L'app ha un'unica schermata che mostra una serie di pulsanti. Facendo clic su un pulsante viene visualizzata una vista associata che si sovrappone ai pulsanti. Facendo clic su un altro pulsante si nasconde la precedente visualizzazione di sovrapposizione e ne viene visualizzata un'altra.

Anche semplificare la gestione dell'interfaccia utente in IB Ho deciso di creare più file di pennino per ogni vista secondaria che deve apparire quando si fa clic sul relativo pulsante. Sto quindi caricando il file del pennino della vista secondaria nel metodo viewDidLoad del controller di visualizzazione utilizzando la classe UINib.

L'idea alla base di questo è stato evitare di avere più viste impilate l'una sull'altra in un singolo file di pennini poiché sarebbe difficile da manipolare in IB. Avrei potuto creare tutte le viste in codice, ma ciò richiederebbe un sacco di codice noioso in quanto i layout di ciascuna vista secondaria sono piuttosto complessi (con più viste secondarie).

Esempio di codice che carica una vista secondaria da un file di pennino.

- (void)viewDidLoad 
{ 
    UINib *aSubViewNib = [UINib nibWithNibName:@"aSubView" bundle:nil]; 
    NSArray *bundleObjects = [aSubViewNib instantiateWithOwner:self options:nil]; 

    // get root view from bundle array 
    UIView *aSubView = [bundleObjects objectAtIndex:0]; 
    [self.view addSubview:aSubView]; 
... 

Il codice sopra riportato viene ripetuto per le altre viste.

Per riepilogare, ho un'app per iPhone a schermo singolo con viste stratificate visualizzate/nascoste facendo clic sui pulsanti. Ciò si ottiene con un controller a vista singola con un file pennino associato e una serie di file di pennini aggiuntivi per le viste secondarie che vengono caricati nel metodo viewDidLoad del controller di visualizzazione.

Domande!

Scusate per la lunga introduzione ma volevo essere molto chiaro di cosa sto facendo.

  • Il mio approccio è sbagliato o insolito?
  • Ci sono potenziali problemi a farlo in questo modo?
  • Cosa hanno fatto altre persone quando hanno bisogno di un'interfaccia dinamica e vuoi ancora conservare tutto in Interface Builder?

Note

Prima che qualcuno si chiede perché non ho solo visualizzo il punto di vista sotto su un nuovo schermo e utilizzare la barra di navigazione, mi permetta di dire che ho ottime ragioni e io capisco iOS Linee guida per l'interfaccia utente. Il caso d'uso di cui sopra non è esattamente il mio caso d'uso, ma è quello che descrive chiaramente il problema senza impantanarsi nella mia app di sviluppo.

Inoltre, so che avrei potuto scrivere tutte le viste secondarie come codice, ma ogni vista secondaria ha un layout complesso di viste secondarie e sarebbe un sacco di codice e fare casino per cercare di farli sembrare giusti.

Grazie in anticipo.

risposta

1

Non esiste necessariamente una relazione 1 a 1 tra i controller di vista e le viste. La maggior parte delle visualizzazioni contiene molte sottoview, che sono le visualizzazioni stesse, quindi questo letteralmente non ha senso.

Tuttavia, a seconda della complessità delle viste (compreso il loro contenuto), è possibile che si desiderino controller di vista separati ... o meno.

Ad esempio, se si dispone di due viste di sbaglio che sono ciascuna di tabella, è possibile che si desideri disporre di un controller di visualizzazione per ogni tabellaView. Ciò è dovuto al fatto che ogni tabellaView sta esaminando gli stessi metodi delegati e, se si trovano nello stesso viewController, i metodi delegati devono distinguere tra le tabelleView. I metodi delegati dispongono di firme che consentono questo, ma, nella mia esperienza, può davvero creare un design di codice disordinato che è difficile da seguire e difficile da gestire.

D'altra parte, si possono avere due tabelle gestite dallo stesso viewController, in cui una tabella è piena di dati significativi e l'altra è semplicemente un segnaposto (come quando l'origine dati è vuota). Uno potrebbe essere visibile mentre l'altro non lo è. Perché complicarti la vita creando due controller di visualizzazione quando entrambi sono guidati dalla stessa origine dati (il modello)?

Nella mia mente, si tratta di quanto sia difficile seguire e gestire il codice. Se la complessità dell'utilizzo di un controller a vista singola diventa gravosa, è consigliabile utilizzare più controller di visualizzazione.

UPDATE

A proposito, ho un esempio che sto attualmente lavorando con che possono illustrare una situazione simile. In InAppSettingsKit, utilizzato da molti sviluppatori, ci sono diversi file xib per parti della vista principale. You can look at the structure here on github. C'è un controller di vista principale e diversi file xib. (C'è anche quello che definirei un controller di visualizzazione "helper" e un controller di visualizzazione di email composer.) In questo esempio, i file xib possono essere utilizzati più volte per specificare il layout delle celle di visualizzazione tabella. Tuttavia, non esiste un controller di visualizzazione per ogni file xib. (La documentazione di InAppSettingsKit è scarsa, quindi queste cose potrebbero non essere ovvie solo dando un'occhiata veloce a questo.)

+0

Quindi, per il mio caso di utilizzo in cui l'unica ragione per cui ho diviso le viste in file di pennini separati è stato per semplificare la gestione di tali visualizzazioni in IB, pensi che il mio approccio sia sicuro da utilizzare o infranga le linee guida di Apple? – Camsoft

+0

Non esiste alcuna regola o linea guida riguardo a ciò che stai facendo. Stai bene a questo proposito. – Jim

+0

Ho aggiunto un esempio di un componente software reale utilizzato da molti sviluppatori. Vedi la mia risposta sopra per maggiori dettagli. – Jim

1

Ogni vista dovrebbe avere un UIViewController corrispondente. Usando un ViewController per "Controllare" più di una vista interrompe il paradigma MVC. "Controllare" più "viste" da un controller renderà molto più difficile cambiare una cosa senza rompere qualcos'altro.Le scelte che fai su come presentare il contenuto all'utente finale saranno diverse per ogni individuo. Quindi se dici che un NavigationController non funzionerà nel tuo caso, forse una risposta modale è la risposta o, potresti semplicemente istanziare i tuoi UIViewControllers personalizzati e aggiungerli alla tua vista ([addSubview:]), se questa è la strada che vuoi, ma come ho detto, sarebbe utile per voi creare un "controller" per ogni oggetto vista insieme allo xib corrispondente. Se hai bisogno di informazioni inviate indietro, usa un delegato o usa Notifiche per inviare il messaggio alla vista genitore. Ho imparato nel modo più duro che non seguendo il paradigma MVC, ti renderà la vita infelice. Cerca di mantenere il tuo codice il più possibile disaccoppiato. E leggete il pattern di progettazione MVC, non ve ne pentirete.

+0

Tutte le viste secondarie sono legati al singolo schermo e quindi un unico controllore vista.Avrei potuto facilmente aggiungere tutte le viste secondarie nello stesso file del pennino ma, come ho detto, si stava diventando disordinato e difficile da impaginare mentre le viste si sovrapponevano. La mia idea era di scomporre alcune delle viste in file di pennini separati e quindi caricarli nuovamente nella vista principale utilizzando il metodo viewDidLoad del controller di visualizzazione. – Camsoft

+0

Ogni vista dovrebbe avere un UIViewController corrispondente. Usando un ViewController per "Controllare" più di una vista interrompe il paradigma MVC. se questo fosse vero come può funzionare il controller universale della vista ?, ha 2 punte. – Juan

+0

Stavo pensando quasi la stessa cosa @Hubert. Sembra che ci siano alcuni problemi associati a questo. Se la decisione viene presa in fase di esecuzione e con un clic del mouse, questo non significa che lo xib verrà caricato in background, in pratica tutti e uno sarà selezionato? Inoltre, l'autolayout potrebbe aver risolto facilmente il problema. –

0

in realtà è possibile farlo.

Aprire il file .xib, selezionare Proprietario file (in segnaposto) -> "identity inspector" (utility) -> cambiare il nome della classe nel nome del controller -> premere control e trascinare il segnaposto del proprietario del file su View object, selezionare " visualizza "nella finestra di dialogo. Ora puoi personalizzare la tua vista.

p.s. puoi usare le stesse prese del primo xib, devi solo trascinarle sul nuovo xib (+ controllo sicuro).

ecco un tutorial spiegato: http://irawd.wordpress.com/2013/09/05/how-to-link-a-xib-file-to-a-class-and-use-2-xib-files-for-iphone4-and-iphone5/

+0

postare link in SO potrebbe essere buono ma i link tendono a perdersi ... per favore pubblica gli elementi critici della tua risposta nel corpo della risposta. – NirMH

+0

@NirMH modificato. grazie per il feedback, è la mia prima risposta su SO – user3206558

Problemi correlati