2012-09-25 5 views
39

Ho visto questo usato in un video WWDC ma solo molto brevemente. Non sono andati a come creare il file Xib attuale.UITableView registerNib: forCellReuseIdentifier:

Ho una sottoclasse UITableViewCell denominata MyCustomCell. In questo ho diverse proprietà UILabels, UIImageViews, ecc ... tutte configurate come IBOutlets.

Ora, nel mio file XI ter ...

Cosa ho impostato come proprietario del file? Dove faccio riferimento alla mia classe MyCustomCell è questo il proprietario del file?

Una volta impostato il proprietario del file, come faccio a collegarlo alla vista root dello xib?

Ho provato alcune impostazioni ma continuo a ricevere errori durante l'utilizzo.

Oh, il codice che sto usando per iscriversi è ...

self.cellNib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil]; 
[self.tableView registerNib:self.cellNib forCellReuseIdentifier:@"CustomCell"]; 

Grazie

+0

Ciao, @Fogmeister Ho molti dubbi su come stai ponendo la domanda. Le risposte sono corrette come hanno correttamente capito. Nel titolo della domanda si parla di "registro pennino" e nel corpo si menziona su come collegare i file XIB con la classe Cell e out. –

+0

Mi dispiace, sono di fretta, ma la mia domanda è: dobbiamo registrare la cella, mentre stiamo usando la cella personalizzata, con xib. E faccio lo stesso della tua risposta marcata. Non sto usando lo storyboard. –

+0

Sono fuori, per lo più vedo domani quando vengo per lavoro. Grazie. Per favore. –

risposta

44

Normalmente non c'è bisogno di preoccuparsi di proprietario del file in quel caso, perché quando il tableView istanzia la cella dallo UINib fornito/associato insieme allo reuseIdentifier. Caricherà tutti gli oggetti di livello superiore del pennino e utilizza solo il primo oggetto di livello superiore che è della classe UITableViewCell (o forse solo il primo oggetto di livello superiore indipendentemente dalla classe? Ma in generale è solo avere il tuo UITableViewCell nel tuo XIB comunque - senza contare il File's Owner e il First Responder che sono solo "proxy").

In effetti, lo tableView proverà a deselezionare una cella e, se non ne trova uno riutilizzabile, ne creerà una nuova utilizzando lo UINib fornito. Sarà qualcosa di simile a questo:

NSArray* topLevelObjects = [self.cellNib instantiateWithOwner:nil options:0]; 
cell = [topLevelObjects objectAtIndex:0]; 

(Questo è, naturalmente, una versione semplificata solo per mostrare l'idea, non so se si chiama in realtà queste linee precise, ma dovrebbe essere abbastanza vicino)

Così il File's Owner non viene utilizzato in questo caso particolare, e avete solo bisogno di mettere un semplice personalizzato UITableViewCell come l'unico top-level-oggetto del file XIB accanto al già esistente File's Owner aNF First Responder (che, di nuovo, sono solo "proxy"/"Riferimenti di oggetti esterni" e non verranno istanziati e non faranno parte degli oggetti di livello superiore restituiti da instantiateWithOwner:options:).


Se ancora non funziona:

  • Assicurarsi si correttamente riempito il reuseIdentifier del vostro UITableViewCell in IB (nel riquadro Inspector sulla destra, una volta selezionato il vostro cellulare in IB) e utilizzato lo stesso identico valore per questa proprietà reuseIdentifier in IB che quella che si utilizza nel codice.
  • Se ancora nessuna fortuna, si prega di fornire maggiori informazioni, in particolare che tipo di errore, messaggio di registro o eccezione avete.
+3

Grazie! Stavo lasciando la vista dall'alto come un UIView, motivo per cui non funzionava. Una volta che l'ho cancellato e ho aggiunto UItableViewCell come vista dall'alto, ha funzionato bene. Grazie. – Fogmeister

+3

Volevo solo commentare di nuovo. Questo è stato così incredibilmente utile! Ho rifattorato un'intera interfaccia utente dal mio storyboard e ho separato file XIB che hanno ridotto drasticamente la complessità e la manutenzione dell'app a cui sto lavorando! Grazie ancora: D – Fogmeister

+0

Felice di averlo aiutato;) – AliSoftware

9

ho trovato il codice indicato nella domanda è bene, ma non è possibile fare riferimento al self.tableView nel metodo init se si sta utilizzando storyboard. Ci sono alcuni discussion su di esso in un'altra domanda.

Quindi la prima linea va nella init:

self.cellNib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil];

Ma questa linea dovrebbe andare in viewDidLoad o simile:

[self.tableView registerNib:self.cellNib forCellReuseIdentifier:@"CustomCell"];

che corregge il mio errore misterioso, per esempio "*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle <Foo.app> (loaded)' with name 'Ogf-Sj-1ej-view-bBf-Ti-Dda''"

E, sì, sto facendo qualcosa di molto simile per estrarre le cose dagli storyboard e inserirli in xibs per il riutilizzo attraverso i controller di visualizzazione!

+0

Ach, non è un messaggio di errore molto ovvio! – fatuhoku

+0

@fatuhoku Benvenuti nel mondo degli errori xcode/objectivec. Non sono così utili i breakpoint in arresto nel metodo principale? – csga5000

3

Oltre a Risposta da "AliSoftware" Si noti la cosa meno ovvia qui fuori è che l'UITableViewCell deve essere il Root View * SOPRA * anche l'UIView. Di default quando ho selezionato un nuovo file IB, crea un UIView. Quindi l'eliminazione di UIView aiuta. Grazie.

PS: volevo commentare quella risposta ma per qualche strana ragione non posso commentare, posso solo rispondere. Credo di aver bisogno di una certa valutazione.

Problemi correlati