2012-04-03 12 views
21

Utilizzando storyboard, celle statiche, in cellForRowAtIndexPath: lineacellule Storyboard statiche: dequeueReusableCellWithIdentifier restituisce nil

UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

restituisce sempre nil.

Ho controllato il seguente:

  • identificatore della cella è impostato correttamente in IB/Storyboard e io uso lo stesso identificatore nel codice. L'ho verificato molte volte.
  • Non ho istanziato il controller di visualizzazione altrove (che era il problema in this stackoverflow question).

mio controller di vista è una sottoclasse di UITableViewController, ovviamente, avvolto in un apposito regolatore navigazione in storyboard. Sospettando che il mio controller di visualizzazione non sia in qualche modo a conoscenza degli identificatori di cella definiti nello storyboard perché potrebbe essere un'altra istanza, ecco il codice che lo "istanzia". In prepareForSegue:, io uso

CustomViewController *vc = [[[segue destinationViewController] 
    viewControllers] objectAtIndex:0]; 

Altre personalizzazioni del controller della vista fatto qui (impostazione delle proprietà, ecc) funziona bene.

Sto utilizzando celle statiche perché il numero di sezioni e righe non cambia e ogni cella contiene testo statico (e altri controlli o campi di testo da modificare).

Mi sembra un'attività molto comune (personalizzare le celle statiche dallo storyboard nei metodi dell'origine dati del controller di visualizzazione). Che cosa sto facendo di sbagliato?

+0

Dovrete mostrarci dove effettivamente gestite la creazione della vostra cella personalizzata. Questa è la parte importante. – borrrden

+0

Creo la cella personalizzata nello storyboard. Digita "Custom" e il suo identificatore di cella. Non funziona così? – Mundi

+0

Ho perso l'intera parte statica. Le celle statiche sono progettate interamente nello storyboard. vedi la parte 2 di questo eccellente tutorial www.raywenderlich.com/5191/beginning-storyboards-in-ios-5-part-2 – borrrden

risposta

44

Con il contenuto statico in una vista tabella, non si implementa nessuno dei metodi dell'origine dati (incluso tableView:cellForRowAtIndexPath:, quindi non si elimineranno mai le celle. Non è presente alcuna eliminazione per il contenuto statico (in cui è possibile essere coinvolti, in ogni caso) .

Se si desidera ottenere un puntatore a una cella particolare:

  • ottenere dalla visualizzazione tabella utilizzando cellForRowAtIndexPath::

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    
  • avere una presa per la cella specifica e personalizzarla direttamente.

  • Itera attraverso le cellule e controllare la proprietà reuseIdentifier per ottenere la cella che ti interessa.

Ognuna di queste cose può essere fatto in viewWillAppear o simili.

Se si desidera avere contenuto completamente diverso nelle celle rispetto a quello trovato nello storyboard, le celle statiche probabilmente non sono la scelta giusta. Dovresti utilizzare i prototipi dinamici (nota che puoi avere più prototipi nello storyboard) con i tradizionali metodi di origine dei dati.

+0

Grazie - così per quello che voglio fare sembra che ho davvero bisogno di usare le celle del prototipo. Potresti aggiungerlo alla tua risposta, quindi posso verificarlo? Grazie per i tuoi chiarimenti! – Mundi

+0

Modificata la mia risposta, non hai effettivamente detto cosa stavi cercando di fare, quindi spero che aiuti! – jrturton

+0

Sto cercando di avere etichette di titoli statici e campi di testo modificabili in alcune celle e altri controlli in altri. Ho pensato che puoi inserire dati dinamicamente in celle statiche. Il numero o la posizione delle celle non cambia. Ho iniziato a farlo con le celle prototipo, ed è così tanto lavoro - quasi peggio di prima dello storyboard! – Mundi

0

La soluzione era utilizzare celle prototipo anziché celle statiche. Sto ancora dando l'assegno a @jrturton dato che è stato il primo a farmi avere l'idea.

Un altro errore interessante che ho appena risolto: con le cellule prototipo di tipo "Custom", se si tenta di riempire cell.textLabel con il testo, sarà solo funzionerà automaticamente, ma tutte le altre subviews si comportano in modo strano. Ora uso la mia etichetta personalizzata e tutto funziona correttamente.

Ciao, grazie a tutti per l'aiuto.

+0

come hai usato la cella "personalizzata"? perché dequeueReusableCellWithIdentifier restituisce nil? –

+0

È possibile specificare "Personalizzato" in Interface Builder. – Mundi

+0

Ho specificato Custom in Interface Builder, quindi ho sottoclassato UITableViewCell e assegnato a questa cella. Ma porta celle vuote vuote. –

0

diverso alla risposta di cui sopra,

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

non funzionerà. Ma il metodo menzionato per creare uno sbocco per lo cell funziona.

È inoltre possibile posizionare viste come UIButtons o UITextFields su cell e disporre di prese per quelle pure.

Entrambi i metodi possono anche essere utilizzati in combinazione. Per esempio. impostare cell.textLabel.text per una cella specifica e disporre di un altro controllo a cui sarà possibile accedere dall'uscita dei controlli.

0

Nello storyboard, le celle statiche NON POSSONO implementare i metodi nel protocollo <UITableViewDataSource>.

Quindi è possibile utilizzare i metodi che sono inclusi in <UITableViewDelegate>.

0

È ancora possibile utilizzare DataSource/delegare metodi di staticità UITableView, semplicemente non è necessario creare nuove celle.

Se si desidera modificare le cellule con metodi DataSource all'interno cellForRowAtIndexPath::

UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 

e quindi avviare la modifica delle cellule.

Problemi correlati