2012-11-06 23 views
7

Ho un programma in cui è presente un TableViewController con 1 sezione e 3 righe. Ogni volta che eseguo l'app, si blocca sempre al metodo dequeueReusableCellWithIdentifier:. Ho inserito un punto di interruzione e NSLog() a zero in questo metodo. Ho anche impostato il Cell Identifier della cella prototipo nello storyboard su Cell. Ma il programma si blocca ancora. Ecco un metodo che causa il problema:Il programma si arresta in modo anomalo a dequeueReusableCellWithIdentifier:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"indexPath.section = %d, indexPath.row = %d", indexPath.section, indexPath.row); 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    if (cell == nil) 
    { 
     NSLog(@"in nil"); 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
    } 

    return cell; 
} 

Il registro blocchi si legge:

MyAppTake4[7463:707] indexPath.section = 0, indexPath.row = 0 
2012-11-05 23:21:20.747 MyCardAppTake4[7463:707] -[UITableView  dequeueReusableCellWithIdentifier:forIndexPath:]: unrecognized selector sent to instance  0xfbc9000 
2012-11-05 23:21:20.753 MyCardAppTake4[7463:707] *** Terminating app due to uncaught  exception 'NSInvalidArgumentException', reason: '-[UITableView  dequeueReusableCellWithIdentifier:forIndexPath:]: unrecognized selector sent to instance  0xfbc9000' 
*** First throw call stack: 
(0x3254788f 0x3459d259 0x3254aa9b 0x32549915 0x324a4650 0x7e2f7 0x31fceefb 0x31fcdfd9  0x31fcd763 0x31f71f15 0x324a61fb 0x3420aaa5 0x3420a6bd 0x3420e843 0x3420e57f 0x342064b9  0x3251bb1b 0x32519d57 0x3251a0b1 0x3249d4a5 0x3249d36d 0x315f4439 0x31f9ccd5 0x7d9f9 0x7d994) 
terminate called throwing an exception(lldb) 

Sono interessato a identificare l'esatta causa di errore in modo che non faccio più questo errore.

Grazie per il vostro aiuto.

+1

Il metodo 'UITableView'' dequeueReusableCellWithIdentifier: forIndexPath: 'è stato aggiunto in iOS 6.0. Stai ottenendo questo errore in iOS 5.x? – rmaddy

risposta

9

Questo perché [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath]; è stata aggiunta in iOS 6, ma non riconosciuto dal iOS 5. Per iOS 5 l'uso della compatibilità qui sotto invece il metodo:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
+5

'dequeueReusableCellWithIdentifier: forIndexPath:' è un metodo perfettamente valido a partire da iOS 6.0. – rmaddy

+3

grazie cyberpawn .. ha funzionato. Dopo aver rimosso 'forIndexPath: indexPath', il programma ha iniziato a funzionare. questo metodo era presente di default quando ho creato un nuovo file con sottoclasse di 'UITableViewController'. Se 'forIndexPath: indexPath' è il colpevole, perché è presente nel programma di default? –

+0

poiché il tuo commento mi ha aiutato a identificare prima il problema, ho accettato la tua risposta. Sono anche grato ad altri per il roping in! :-) –

7

Ti sei registrato la classe della cella o il pennino prima?

Dalla documentazione di Apple:

Importante: È necessario registrare un file di classe o di pennino con il registerNib: forCellReuseIdentifier: o registerClass: forCellReuseIdentifier: metodo prima di chiamare questo metodo.

(btw che il metodo è disponibile solo in iOS 6)

Se stai usando iOS 6, quindi è possibile utilizzare il nuovo paradigma più semplice:

In viewDidLoad, registrare la classe, nel tuo caso , questo è solo la classe UITableViewCell:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"]; 

Poi, si può solo fare in questo modo in cellForRowAtIndexPath:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
    cell.textLabel.text = self.myArray[indexPath.row]; 
    return result; 
} 
+0

Ho registrato la classe del ViewController. Non ci sono "pennini" dal momento che sto usando lo storyboard. 'cyberpawn' mi ha aiutato a scoprire l'errore. Grazie per l'aiuto. –

+0

ottimo .. terro 'in mente rdelmar! –

+0

L'aggiunta del metodo 'registerClass' nel mio' viewDidLoad' ha fatto il trucco per me. Grazie. –

1

Poiché forIndexPath è per ios6, ti consiglio di utilizzare questo snipet. Trovare sotto.

UITableViewCell *cell = [table_view dequeueReusableCellWithIdentifier:@"cell"]; 
if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 

    // **initialize** your stuff here **with their respected tag** 
} 
else 
{ 
    // **get** your stuff back using their tags 
} 
// **assign** your valiues here 

return cell; 

una programmazione

+0

grazie Foram Mukund Shah! –

0

ho avuto questa eccezione, e si rese conto che è stato causato dal mio stupido errore. Avevo creato un file .xib vuoto (per avere una cella "Caricamento" personalizzata nel mio UITableView), ma avevo poi trascinato un View all'interno di esso. Doh!

Il risultato è stato il messaggio di eccezione che si sta vedendo, oltre a questo nella finestra di output:

2014-04-25 20:45:12.953 Languages[36256:60b] *** Terminating app due to uncaught 
exception 'NSInternalInconsistencyException', reason: 'invalid nib registered 
for identifier (LoadingCell) - nib must contain exactly one top level object 
which must be a UITableViewCell instance' 

La soluzione, naturalmente, è stato quello di aggiungere un Table View Cell al mio file .xib, copiare l'altro Componenti dell'interfaccia utente in esso, e lasciare solo quella tabella Visualizza cella come elemento "root" nel file.

+0

Sì, ho fatto accidentalmente la stessa cosa.Il mio file .xib era perfetto ... ma avrei erroneamente trascinato un'etichetta sul .xib, al di fuori del vista principale. (Sigh.) Gesso un'altra ora sprecata. –

0

Un'altra causa di questo errore può essere-

pennino non valido registrato per identificatore (cellulare) - pennino deve contenere esattamente un oggetto di livello superiore che deve essere un esempio UICollectionReusableView

ho avuto un UIView nel mio XI ter invece di una collezioneViewCell. Spero che questo ti aiuti.

Problemi correlati