2010-02-08 10 views
43

io non effettivamente vedere il mio errore:UITableView dataSource deve restituire una cella da tableView: cellForRowAtIndexPath: eccezione

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 

    FriendTableViewCell *cell = (FriendTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[FriendTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     [[NSBundle mainBundle] loadNibNamed:@"FriendTableViewCell" owner:self options:nil]; 
     cell = friendCell; 
    } 
    cell.lblNickname.text = @"Tester"; 
    return cell; 
} 

Che cosa sto facendo di sbagliato? Ho controllato tutto due volte .. ma non vedo l'errore.

Grazie per il vostro aiuto!

risposta

66

Stai tornando amicoCell, ed è molto probabilmente nullo.

Il tuo codice sembra buono, quindi assicurati di aver impostato correttamente il tuo file di Interface Builder. In FriendTableViewCell.xib, assicurati che il proprietario del file sia il tuo controller di visualizzazione tabella e che imposti correttamente la cella come presa per friendCell (che presumo sia UITableViewCell).

+1

Grazie, dopo aver controllato di nuovo, ho trovato una connessione di uscita mancante in Interface Builder! – phx

+1

Grazie, la tua risposta è proprio ciò di cui avevo bisogno. Avevo cambiato il nome della classe del controller di visualizzazione, interrompendo la connessione a IB senza pensarci su. Niente più nomi che cambiano perché non mi piacciono! –

+0

Ottima risposta, di solito il problema è qualcosa nel restituire una cellula nil! – Fattie

2

Si sta creando un FriendTableViewCell e quindi ignorandolo e impostandolo uguale a (presumibilmente) una variabile di istanza denominata friendCell.

Presumo che ci si aspetta che friendCell venga impostato quando si chiama il metodo loadNibNamed. Apparentemente non viene impostato.

Quindi hai due problemi con questo codice. Innanzitutto, non assegnare una cella due volte.

cell = [[[FriendTableViewCell .... 
[[NSBundle mainBundle ..... 
cell = friendCell; 

Ovviamente, la creazione di una nuova cella e assegnandolo alla cella è inutile se si sta sovrascrivendo con la seconda chiamata per l'assegnazione alla cella.

In secondo luogo, friendCell è probabilmente nullo. Assicurarsi che il NIB sia impostato correttamente e che le prese puntino ai posti giusti.

+0

Grazie per il vostro aiuto! friendCell è il mio Outlet, quindi come configurare correttamente? – phx

0

un'occhiata qui: Loading TableViewCell from NIB

Si tratta di documenti di Apple per questo argomento esatto.

//This is assuming you have tvCell in your .h file as a property and IBOutlet 
//like so: 
TableViewController.h 
@property(nonatomic,retain) IBOutlet UITableViewCell *tvCell; 
//Data Source Method... 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

if (cell == nil) { 

    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil]; 

    cell = tvCell; 

    self.tvCell = nil; 

use the loadNibNamed: owner: metodo di opzioni per caricare una cella in un pennino. Imposta l'istanza cella sull'oggetto pennino, quindi imposta l'oggetto pennino su zero.

Leggi il resto della documentazione che ho collegato per sapere come accedere alle visualizzazioni secondarie all'interno della cella.

2

So che questo è un vecchio post ora ma, ho appena riscontrato questo errore, ho trovato molto strano l'app era in testing quindi nessuna build recente per alcuni giorni e lo ha fatto, tutto ciò che ho fatto è stato riavviare il telefono e lo ha risolto.

33

Per me ha funzionato facendo questo:

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

UPDATE
Inserire il codice di cui sopra nel seguente metodo:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

Basta mettere PRIMA la modifica del tableViewCell

0

Non dimenticare di impostare cell identifier in Interface Builder.

0

Usa questa,

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellID]; 

ho salvato qualche ora in più con solo queste linee.

0

Assicurarsi identificatore tuo riutilizzo nel file NIB/Storyboard per le partite prototipo di cella qualunque cosa tu chiamati CellIdentifier

static NSString *CellIdentifier = @"Cell"; 
1

ho scoperto che questo problema è venuto quando si cerca di creare il mio UITableViewCell prima inizializzazione mia vista tabella:

Qui registrando la classe prima di creare la tabellaView causerà l'errore, ponendolo dopo verrà corretto l'errore.

[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:bCellIdentifier]; 

tableView = [[UITableView alloc] initWithFrame:CGRectZero]; 
tableView.delegate = self; 
tableView.dataSource = self; 

[self addSubview:tableView]; 

tableView.keepInsets.equal = KeepRequired(0); 
+0

nel mio caso chiamo la funzione per caricare i dati prima che la tabella UITableViewCell registri, upvote come la tua risposta mi aiuta a superare questo problema – iphonemaclover

Problemi correlati