2012-12-29 10 views
5

Sono nuovo per questo motivo, per favore portami con me:Come ottenere una classe UITableViewCell personalizzata creata in IB da caricare in un UITableView?

Ho un file .xib in IB contenente un UIScrollView che ha un UITableView incorporato in esso. Vorrei caricare UITableViewCells personalizzati in UITableView. Ho quattro/cinque celle personalizzate create in IB ma non riesco a caricare il primo correttamente.

Qui ci sono le immagini di rilevanti da IB:

.xib custom cell "itemCell"

ho impostato la classe per l'usanza UITableViewCell creato in IB alla classe UITableView ho creato chiamato "itemCell". Inoltre, ho collegato i tre campi di testo e i delegati a "itemCell".

Ecco itemCell.h:

#import <UIKit/UIKit.h> 

@interface itemCell : UITableViewCell 
@property (weak, nonatomic) IBOutlet UITextField *quantityTextField; 
@property (weak, nonatomic) IBOutlet UITextField *itemTextField; 
@property (weak, nonatomic) IBOutlet UITextField *priceTextField; 

@end 

Ecco itemCell.m:

#import "itemCell.h" 

@implementation itemCell 
@synthesize quantityTextField,itemTextField,priceTextField; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 

    } 
    return self; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 

@end 

In filecontroller.m, che è file di implementazione del .xib rootcontroller creo una nuova cella sulla base di l'utente che preme un pulsante (aggiungilo a un array) e quindi ricarica la vista tabella. Non ricevo errori, ma sto caricando una normale cella piuttosto che ciò che ho creato in IB. Qui è rootcontroller.m. Qualsiasi aiuto è apprezzato.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    scrollView =(UIScrollView *)self.view; 
    items = [[NSMutableArray alloc] init]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [items count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
     return [items objectAtIndex:[indexPath row]]; 
} 

- (UITableViewCell *)initiateNewCell{ 
    itemCell *cell = [[itemCell alloc] init]; 
    cell.accessoryType = UITableViewCellAccessoryNone; 
    cell.selectionStyle = UITableViewCellSelectionStyleBlue; 
    return cell; 
} 

- (IBAction)addItem:(id)sender { 
    //creates the new cell to be added 
    [items addObject:[self initiateNewCell]]; 
    [self.tableView reloadData]; 
+0

Queste celle personalizzate verranno riutilizzate (visualizzate più volte) o utilizzate una sola volta all'interno di UITableView? Anche UITableView è costruito su un UIScrollView, quindi nella tua situazione non credo ci sia bisogno di mettere un UITableView all'interno di un UIScrollView. – thedeveloper3124

+0

Queste celle personalizzate verranno visualizzate più volte. Ogni volta che l'utente preme il pulsante Aggiungi, idealmente viene creata una nuova riga e la cella personalizzata lo popola. Penso che il mio problema potrebbe risiedere nell'IB. Ho creato un UITableViewCell al di fuori di un viewcontroller. Dovrebbe essere all'interno del viewcontroller di cui sopra o non è rilevante. Grazie per le informazioni sullo scrollview. – IkegawaTaro

+0

Solo una nota che i nomi di classe dovrebbero sempre iniziare con una lettera maiuscola per seguire le convenzioni di denominazione standard, quindi dovrebbe essere davvero 'ItemCell'. Tuttavia, probabilmente vorrai anche considerare un nome più descrittivo. –

risposta

8

come di iOS 5 è ora possibile caricare un UITA bleViewCell da un pennino per il riutilizzo delle celle con la seguente funzione.

- (void) registerNib: (UINib *) Pennino forCellReuseIdentifier: (NSString *) Identificativo

  1. In primo luogo assicuratevi di creare un file di IB che contiene solo l'UITableViewCell
  2. Sotto Identificare ispettore: impostare la classe del UITableViewCell a "itemCell" enter image description here
  3. Sotto attributi ispettore: impostare l'identificatore del UITableViewCell a "itemCellIdentifier" enter image description here
  4. In viewDidLoad: inserire il seguente codice e sostituire itemCellNibName con il nome del pennino che contiene UITableViewCell.

    NSString *myIdentifier = @"itemCellIdentifier"; 
    [self.tableView registerNib:[UINib nibWithNibName:@"itemCellNibName" bundle:nil] forCellReuseIdentifier:myIdentifier]; 
    
  5. In cellForRowAtIndexPath: Inserire il codice seguente, è ora possibile accedere alle proprietà IBOutlet impostate sul itemCell, e collegato nel pennino.

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
    { 
        static NSString *myIdentifier = @"itemCellIdentifier"; 
    
        itemCell *cell = (itemCell *)[tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
        cell.textLabel.text = [NSString stringWithFormat:@"Test Row:%i!",indexPath.row]; 
        return cell; 
    } 
    

anche: Se non si desidera includere l'UITableView all'interno di un UIScrollView, un UIScrollView è già integrato nel UITableView, che permette per una corretta assorbire tutti cellule.

Inoltre: suggerisco di ottenere le ossa nude di questa operazione prima, prima di iniziare a estrarre i dati da un array.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
     return 10; 
    } 

anche: Come qualcun altro aveva accennato, l'array contiene i dati che popoleranno le UITableViewCells, non le cellule veri e propri.

+0

Grazie mille per questa risposta. Ho una domanda. Per il passaggio 4. L'unico file "NIB" (credo) nel mio progetto è ViewController.xib. In c'è un UIViewController e l'UITableViewCell che ho incollato come sopra.Il nome file NIB dovrei usare per sostituire @ "itemCellNibName" @ "ViewController"? Ho semplificato il codice in modo significativo secondo la tua raccomandazione per ottenere le basi prima. – IkegawaTaro

+0

Bene, quello che vorrai fare è separare entrambi quelli nei loro file di pennini. Quindi lascia andare creare un pennino per UITableViewCell. Nella barra dei menu, vai su file-> nuovo-> file. Nella finestra a discesa visualizzata, seleziona Interfaccia utente nella colonna di sinistra. Scegli l'opzione "Vuota". Famiglia di dispositivi iPhone. Chiamalo itemCellNib. In questo nuovo pennino, trascina un UITableViewCell e segui le istruzioni sopra riportate per esso. Nel punto ViewController, eliminare UITableViewCell da esso. Quindi per il nome file NIB metti @ "itemCellNib" – thedeveloper3124

+0

Grazie! negli ultimi 30 minuti ho trovato un altro sito che parlava della creazione dei file di pennini separati: l'ho fatto e ho fatto funzionare il mio codice. Sei stato di grande aiuto e hai trasformato quella che era una lunga giornata frustrante in una serata gratificante. – IkegawaTaro

2

Nelle proprietà vostra

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

    //This identifier string needs to be set in cell of the TableViewController in the storyboard 
    static NSString *CellIdentifier = @"Cell"; 

    // Resuse the cell 
    SomeCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // If there are no cell to be reused we create a new one 
    if(cell == nil) { 
     cell = [SomeCustomCell new]; 
    } 

    // Configure the cell... 
    NSString *someString = [yourArrayWithStringsOrWhatEver objectAtIndex:indexPath.row]; 

    // Setting the some property of your custom cell 
    [cell.yourSpecificCellProperty someString]; 

    [cell.yourOtherSpecificCellProperty setText:@"What Ever your want!"]; 
} 

tua cella potrebbe essere qualunque sia il tuo hanno collegato al vostro cellulare personalizzato in Interface Builder.

Spero che aiuti!

1

Beh ci sono alcune cose che non sono giuste:

  • Il nome della classe inizia con lettera maiuscola itemCell ->ItemCell
  • Si dovrebbe riutilizzare il cellulare. Nel modo in cui vuoi farlo, creerai una cella separata per ogni percorso dell'indice.
  • matrice items dovrebbe contenere solo l'origine dei dati della tabella, non le cellule
  • invece di chiamare i dati di ricarica, è possibile aggiungere una sola riga alla tabella, e può essere animato anche

provare qualcosa di simile:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    scrollView =(UIScrollView *)self.view; 
    items = [[NSMutableArray alloc] init]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [items count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) { 
     cell = [[NSBundle mainBundle] loadNibNamed:@"itemCell" owner:self options:nil].lastObject; 
     cell.reuseIdentifier = CellIdentifier; 
    } 

    // Do any additional setup to the cell 

    return cell; 
} 

- (IBAction)addItem:(id)sender { 
    [items addObject:[NSNumber numberWithInt:items.count]]; // Here comes the data source 
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:items.count - 1 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 

PS: ho scritto senza un IDE quindi ci potrebbero essere alcuni errori

+0

Grazie mille per la risposta. I problemi rimanenti sono: 1) 'cell.reuseIdentifier = CellIdentifier;' mi sta dando l'errore: "assegnazione alla proprietà di sola lettura". 2) Facendo clic su "aggiungi" ottengo un altro errore su "numero di righe non valido". Sembra che il numero risultante di righe sia ancora 0 quando dovrebbe essere 1. Qualche idea? Inoltre, sono confuso su questa riga: cell = [[NSBundle mainBundle] loadNibNamed: @ proprietario "itemCell": self options: nil] .lastObject; Il singolo UITableViewCell in IB è considerato un pennino? – IkegawaTaro

+0

Non è possibile eseguire 'cell.reuseIdentifier = CellIdentifier'. Invece, imposta l'identificativo di riutilizzo nel NIB 'itemCell'. –

+0

Mi dispiace per il riutilizzo, Michael ha ragione, l'ho impostato dal pennino. Riguardo all'errore, senza eseguire il tuo codice, non so cosa c'è di sbagliato in questo. E un pennino è un file con estensione XIB, dovresti creare per il tuo itemCell un file di pennino separato. – Levi

Problemi correlati