2013-05-22 13 views
13

Così ho registrano mia cella:stile UITableViewCell e dequeueReusableCellWithIdentifier

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

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

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

Il problema è che non posso impostare la proprietà cell.detailTextLabel.text. La cella non è mai nil.

+0

Qualche messaggio di errore? Stai usando IB o storyboard? –

+0

Nessun errore. Solo nessun testo nella tag di testo dettagliata. – Padin215

risposta

24

Se chiamato prima, la vista tabella registerClass causerà dequeueReusableCellWithIdentifier per restituire una cella non nulla se l'identificativo di riutilizzo delle celle corrisponde.

Credo che registerClass sia generalmente utilizzato per celle che saranno una cella personalizzata derivata da UITableViewCell. La tua cella personalizzata può sovrascrivere initWithStyle e impostare lo stile lì.

Non è sempre necessario creare una cella personalizzata.

Se si desidera impostare lo stile della cella, non chiamare registerClass.

+2

Sì, non registrando la classe lo ha fatto. Grazie. – Padin215

+0

La mancata registrazione della classe genera 'NSInternalInconsistencyException'. "motivo: 'impossibile disconnettere una cella con identificatore FileLogCell - deve registrare un pennino o una classe per l'identificatore o collegare una cella prototipo in uno storyboard'" –

+2

Correzione per il problema di @RahulJiresal è assicurarsi di usare '[tableView dequeueReusableCellWithIdentifier: @ "MyIdentifier"] 'e NOT' [tableView dequeueReusableCellWithIdentifier: @ "MyIdentifier" perIndexPath: indexPath] ' – Gomfucius

1

Provare a utilizzare lo stile UITableViewCellStyleSubtitle per la cella. Modificare la riga nel if per questo:

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
2

è necessario modificare lo stile di cella:

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

a questo

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

Questo funziona per voi.

+0

Una volta rimossa la registrazione della cella, la cella era nul e si inizializzava. E ho dovuto cambiare lo stile della cella, grazie. – Padin215

+0

Il resto del codice rimane lo stesso, basta cambiare lo stile della cella. –

1

Il modo più semplice è utilizzare lo storyboard e impostare lo stile della cella in IB. In tal caso, non dovresti registrare nulla, né dovresti avere una clausola if (cell == nil). Non sembra importare se si usi dequeueReusableCellWithIdentifier: o dequeueReusableCellWithIdentifier: forIndexPath. Entrambi sono garantiti per restituire una cella quando quella cella viene creata nello storyboard.

+0

Io non preferisco IB, non l'ho usato molto e ho preferito rimanere tutto in codice. Ho però bisogno di familiarizzare con l'uso di IB. Grazie – Padin215

8

quello che devi fare seguito 3 cambi per raggiungere te obiettivo:

  1. rimuovere dichiarazione registerClass.
  2. UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath]; => UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
  3. uso initWithStyle: UITableViewCellStyleSubtitle

Di solito ci sono due modi per creare delle cellule con la sottile, in primo luogo con l'abitudine UITableViewCell, fissati stile nel init. in secondo luogo con il codice seguito, che è quello che volevi:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
} 
1

Creare una cella personalizzata. Cambia il suo stile nel generatore di interfacce. Usa la vista tabella registra la cella dal pennino del tuo controller di visualizzazione.

Set the style

E il codice:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self.tableView registerNib:[UINib nibWithNibName:@"YourCustomCell" bundle:nil] forCellReuseIdentifier:kReuseIdentifier]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    YourCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kReuseIdentifier]; 

    // Do things with the cell. 
    // The cell has no chance to be nil because you've already registered it in viewDidLoad method. 
    // So there's not need to write any code like if(cell==nil). 
    // Just use it. 

    return cell; 
} 
1

Questa è una vecchia questione. Voglio solo fornire una soluzione alternativa.

perché non provare qui di seguito, dopo aver registrato la cella:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

poi fare:

[cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier ]; 

Funziona per me.

Problemi correlati