2013-04-02 18 views
13

ottengo il seguente errore:Perché ricevo un errore relativo all'impossibilità di rimuovere la coda quando il mio UITableView tenta di caricare?

* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier FontCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

io non sono sicuro di quello che sto facendo male. Ho impostato l'identificatore della cella (a livello di codice, poiché non è stato creato tramite Interface Builder) e faccio tutto ciò che pensavo dovessi fare nei metodi delegate, ma sto ancora ricevendo quell'errore quando provo a caricare UITableView.

Ecco il relativo codice (vale la pena notare che ho sottoclasse UITableViewCell per le opzioni di personalizzazione):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.fonts.count; 
} 

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

    FontCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

    if (!cell) { 
     cell = [[FontCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FontCell"]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 

    int row = indexPath.row; 

    cell.fontFamilyLabel.text = self.fonts[row]; 

    return cell; 
} 

Ed ecco l'unico metodo che ho cambiato nella mia sottoclasse UITableViewCell (FontCell):

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     self.fontFamilyLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 200, 20)]; 
     self.fontFamilyLabel.textAlignment = NSTextAlignmentCenter; 

     [self.contentView addSubview:self.fontFamilyLabel]; 
    } 
    return self; 
} 

Cosa sto facendo di sbagliato?

+0

ho trovato questa discussione si ha una buona soluzione: http: // StackOverflow.it/questions/12737860/assertion-failure-in-dequeuereusablecellwithidentifier forindexpath –

risposta

28

La soluzione più semplice è cambiarla in FontCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; Come per il codice corrente, è necessario verificare che lo cell non sia nil se si utilizza questo metodo.


In alternativa, è possibile registrare un UINib o Class a livello di tabella che è legato ad @"FontCell"

Per esempio (in viewDidLoad):

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

allora si può fare

FontCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FontCell" forIndexPath:indexPath]; 

La cosa bella con questo metodo è che sai che la tua cella non sarà mai nil, quindi puoi iniziare immediatamente a modificarla.

+0

Cosa succede se cambio l'identificatore per ogni cella. Non penso che funzionerà c'è un altro modo? –

4

Si sta utilizzando il metodo dequeueReusableCellWithIdentifier:forIndexPath:. La documentazione per quel metodo dice questo:

You must register a class or nib file using the registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier: method before calling this method. 

Così qui

[self.tableView registerClass: [FontCell class] forReuseIdentifier: @"FontCell"]; 
+1

Probabilmente dovrebbe registrare la sua classe 'FontCell', che è una sottoclasse di' UITableViewCell' – Brian

+0

@Brian Yeah quando si utilizza la cella personalizzata registra quella cella –

+0

dovrebbe essere [self.tableView registerClass: [classe FontCell] forCellReuseIdentifier: @ "FontCell"] ; – Henry

2

Ho anche avuto un problema, e la soluzione che ho trovato è:

Vai alla navigazione di progetto e selezionare “ ViewController.h”. Aggiungi

<UITableViewDelegate, UITableViewDataSource> 

dopo "UIViewController".

+0

Cos'è questo? Che cosa fanno? – CRDave

+0

Ho modificato la risposta ora. controllare questo. – offset

1

Se si utilizza una vista tabella (non un controllo vista tabella) come ero, non ci sono celle che appaiono di default.

Nel storyboard selezionare il Tableview Aprire le Attributi cellule Variazione prototipo 0-1 Selezionare la cella di tabella appena visualizzata Nel Attributi impostare l'Identitifier a "FontCell"

Problemi correlati