2012-02-05 13 views
18

Mi piacerebbe creare UITableViewCell personalizzato usando un XIB, ma non sono sicuro di come riciclarlo usando il meccanismo di accodamento di UITableViewController. Come posso realizzare questo?Come posso riciclare oggetti UITableViewCell creati da un XIB?

persone, questa domanda è stata pensata per essere risposta autonoma secondo the FAQ, anche se adoro le risposte fantastiche. Abbi un po 'di voti, concediti una birra. Ho chiesto questo perché un amico mi ha chiesto e volevo metterlo su StackOverflow. Se hai qualcosa da contribuire, con tutti i mezzi!

risposta

51

Se stai usando iOS 5 è possibile utilizzare

[self.tableView registerNib:[UINib nibWithNibName:@"nibname" 
              bundle:nil] 
    forCellReuseIdentifier:@"cellIdentifier"]; 

Poi ogni volta che si chiama:

cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 

tableView sarà o caricare il pennino e vi darà una cella, o di annullare l'accodamento una cella per te!

Il pennino deve essere solo un pennino con una sola tableviewcell definita all'interno di esso!

+3

Non lo sapevo. – Moshe

+2

Era una nuova API introdotta con iOS5 - l'ho usata dal giorno in cui l'ho vista - rende la vita così semplice! Puoi anche diventare più avanzato con la sottoclasse di UITableViewCell e aggiungendo le proprietà di IBOutlet che puntano ai vari controlli nella cella, così non avrai più bisogno di usare ViewWithTag! –

+0

Assolutamente fantastico! – Moshe

2

Creare un pennino vuoto e aggiungere la cella di tabella come primo elemento. Nell'ispettore, è possibile aggiungere la stringa reuseIdentifier in Interface Builder.

Per utilizzare il cellulare nel codice, fare questo:

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *reuseIdentifier = @"blah"; //should match what you've set in Interface Builder 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"YourTableCellNib" owner:nil options:nil] objectAtIndex:0]; 
    } 

    //set up cell 

    return cell; 
} 

c'è un altro metodo in cui si crea uno sbocco per il tuo cellulare e caricare il pennino cellulare utilizzando il controller come proprietario del file, ma onestamente questo è molto più facile.

Se si desidera poter accedere alle sottoview che sono state aggiunte alla cella nel pennino, assegnare loro tag univoci e accedervi con [cella viewWithTag: x];

Se si desidera poter impostare proprietà personalizzate sulla cella, è necessario creare una sottoclasse UITableViewCell personalizzata, quindi impostarla come classe del pennino in InterfaceBuilder e trasmettere UITableViewCell alla sottoclasse personalizzata quando lo rimuovi dal codice sopra.

1

Ecco come si può fare:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    YourCustomeCell *cell = (YourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName]; 
    if (!cell) 
    { 
    NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil]; 
    cell = [topLevelItems objectAtIndex:0]; 
    } 

    return cell; 
} 

Dove cellLoader in .h è definito come segue:

UINib *cellLoader; 

e in .m è istantiated come segue (per esempio durante l'inizializzazione):

cellLoader = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] retain]; 

e CellClassName è definito in .m come segue (è o il nome per il tuo xib).

static NSString *CellClassName = @"YourCustomeCell"; 

Non dimenticare di utilizzare la stringa CellClassName anche nel XI ter creato delle cellule.

Per ulteriori informazioni ti suggerisco di leggere questo fantastico tutorial creating-a-custom-uitableviewcell-in-ios-4.

Spero che aiuti.

P.S. Ti suggerisco di usare UINib perché è un metodo ottimizzato per caricare file xib.

2

Per impostare un UITableViewCell personalizzato utilizzando un XIB, devi fare diverse cose:

  • Impostare un IBOutlet nell'intestazione
  • Configurare la cella di visualizzazione della tabella in Interface Builder
  • Caricare la XIB all'interno di tableView:cellForRowAtIndexPath:
  • configurarlo come qualsiasi altra cellula

Quindi ... Facciamo istituito un IBOutlet nel file di intestazione.

@property (nonatomic, retain) IBOutlet UITableViewCell *dvarTorahCell; 

Non dimenticare di sintetizzarlo all'interno del file di implementazione.

@synthesize dvarTorahCell; 

Ora, creiamo e configuriamo la cella. Si vuole prestare attenzione alla identificatore di cella e l'IBOutlet come illustrato di seguito:

enter image description here

Ora nel codice, si carica il XIB nella vostra cella come illustrato di seguito:

enter image description here

Si noti che l'identificatore di cella in Interface Builder corrisponde a quello mostrato nel codice sottostante.

Poi vai avanti e configura la tua cella come una qualsiasi.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (cell == nil) { 

    [[NSBundle mainBundle] loadNibNamed:@"YUOnlineCell" owner:self options:nil]; 
    cell = dvarTorahCell; 
    dvarTorahCell = nil; 
} 

//configure your cell here. 

Basta notare che quando si accede subviews, quali etichette, è ora necessario fare riferimento a loro per tag, invece che da nomi di proprietà, come ad esempio textLabel e detailTextLabel.

Problemi correlati