2012-12-29 2 views
5

Ich bin neu zu diesem so bitte bitte mit mir:Wie erhalte ich eine benutzerdefinierte UITableViewCell-Klasse, die in IB erstellt wurde, um sie in ein UITableView zu laden?

Ich habe eine .xib in IB mit einem UIScrollView, die eine UITableView eingebettet hat. Ich möchte benutzerdefinierte UITableViewCells in die UITableView laden. Ich habe vier/fünf benutzerdefinierte Zellen in IB erstellt, kann aber nicht die erste korrekt laden.

sind hier relevant Screenshots von IB:

.xib custom cell "itemCell"

ich die Klasse für die benutzerdefinierte festgelegt haben UITableViewCell in IB der UITableView Klasse erstellt habe ich "itemCell" genannt. Zusätzlich habe ich die drei Textfelder Outlets und Delegates mit "itemCell" verbunden. Hier

ist 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 

Hier ist 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, das ist die rootcontroller .xib Implementierung Datei ich eine neue Zelle erstellen, basierend auf der Benutzer drückt eine Schaltfläche (fügen Sie es zu einem Array hinzu) und laden Sie dann die Tabellenansicht neu. Ich bekomme keine Fehler, aber ich bekomme eine normale Zelle geladen, anstatt was ich in IB erstellt habe. Hier ist rootcontroller.m. Jede Hilfe wird geschätzt.

- (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

Werden diese benutzerdefinierten Zellen wiederverwendet (mehrfach angezeigt) oder nur einmal in Ihrem UITableView verwendet? Auch UITableView ist auf einem UIScrollView aufgebaut, so dass ich in Ihrer Situation nicht glaube, dass Sie ein UITableView in ein UIScrollView einfügen müssen. – thedeveloper3124

+0

Diese benutzerdefinierten Zellen werden mehrmals angezeigt. Jedes Mal, wenn der Benutzer auf die Schaltfläche zum Hinzufügen klickt, wird idealerweise eine neue Zeile erstellt, und die benutzerdefinierte Zelle füllt sie. Ich denke mein Problem könnte im IB liegen. Ich habe eine UITableViewCell außerhalb eines Viewcontrollers erstellt. Sollte es innerhalb des Viewcontrollers oben sein oder ist das noch relevant? Danke für die Infos zum Scrollview. – IkegawaTaro

+0

Nur eine Anmerkung, dass Klassennamen immer mit einem Großbuchstaben beginnen sollten, um den Standardnamenskonventionen zu folgen, also sollte es wirklich "ItemCell" sein. Sie sollten jedoch auch einen aussagekräftigeren Namen verwenden. –

Antwort

8

sein Ab iOS 5 Sie jetzt einen uita laden bleViewCell von einer Spitze für die Wiederverwendung von Zellen mit der folgenden Funktion.

- (void) registerNib: (UINib *) nib forCellReuseIdentifier: (NSString *) Kennung

  1. Zuerst eine IB-Datei stellen Sie sicher erstellen, die nur die UITableViewCell
  2. Unter Identifizieren Inspektor enthält: Stellen Sie die Klasse des UITableViewCell zu „itemCell“ enter image description here
  3. Unter Attribute Inspektor: Stellen Sie die Kennung des UITableViewCell zu „itemCellIdentifier“ enter image description here
  4. In viewDidLoad: Fügen Sie den folgenden Code ein und ersetzen Sie itemCellNibName durch den Namen der Schreibfeder, die die UITableViewCell enthält.

    NSString *myIdentifier = @"itemCellIdentifier"; 
    [self.tableView registerNib:[UINib nibWithNibName:@"itemCellNibName" bundle:nil] forCellReuseIdentifier:myIdentifier]; 
    
  5. In cellForRowAtIndexPath: Ort der folgende Code, können Sie jetzt Ihren IBOutlet Eigenschaften, die Sie setzen auf der itemCell, und in der Spitze verbunden ist.

    -(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; 
    } 
    

auch: Sie wollen nicht die UITableView innerhalb eines UIScrollView umfassen, ist ein UIScrollView bereits in die UITableView gebaut, die für die richtige Zelle Schlange stehen können.

Auch: Ich schlage vor, Sie erhalten nur die nackten Knochen dieser zuerst, bevor Sie beginnen, Daten aus einem Array zu ziehen.

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

auch: Als jemand anders erwähnt hatte, enthält das Array die Daten, die die UITableViewCells, nicht die eigentlichen Zellen selbst bevölkern werden.

+0

Vielen Dank für diese Antwort. Ich habe eine Frage. Für Schritt 4. Die einzige "NIB" Datei (glaube ich) in meinem Projekt ist ViewController.xib. Darin gibt es einen UIViewController und die UITableViewCell, die ich oben als Bilder eingefügt habe.Ist der NIB-Dateiname, den ich verwenden sollte, um @ "itemCellNibName" @ "ViewController" zu ersetzen? Ich habe den Code nach Ihrer Empfehlung deutlich vereinfacht, um die Grundlagen zuerst zu klären. – IkegawaTaro

+0

Nun, was Sie tun wollen, ist beides in ihre eigenen Nib-Dateien zu trennen. Also lass uns eine Feder für die UITableViewCell erstellen. Gehen Sie in der Menüleiste zu Datei-> Neu-> Datei. Wählen Sie im Pull-Down-Fenster die Benutzerschnittstelle in der linken Spalte aus. Wählen Sie die Option "Leer". Gerätefamilie iPhone. Nennen Sie es itemCellNib. Ziehen Sie in dieser neuen Schreibfeder eine UITableViewCell und folgen Sie den obigen Anweisungen. Löschen Sie in der ViewController-Schreib-ID die UITableViewCell-Datei. Also für den NIB-Dateinamen setzen Sie @ "itemCellNib" – thedeveloper3124

+0

Danke! In den letzten 30 Minuten habe ich eine andere Seite gefunden, die über das Erstellen der separaten Nib-Dateien sprach - ich habe es getan und meinen Code zum Laufen gebracht. Du warst eine große Hilfe und hast aus einem langen, frustrierenden Tag eine lohnende Nacht gemacht. – IkegawaTaro

2

In Ihrer

- (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!"]; 
} 

Eigenschaften Ihrer Zelle könnte sein, was auch immer Ihr auf Ihre individuelle Zelle in Interface Builder angeschlossen hat.

Hoffe es hilft!

1

Nun gibt es ein paar Dinge, die nicht richtig sind:

  • Der Klassenname beginnt mit Großbuchstaben itemCell ->ItemCell
  • Sie sollten die Zelle wiederverwenden. Wie Sie dies tun möchten, erstellen Sie eine separate Zelle für jeden Indexpfad.
  • die items Array nur die Datenquelle der Tabelle enthalten sollte, Ihre Zellen nicht
  • statt Nachladedaten aufzurufen, können Sie einfach eine Zeile der Tabelle hinzufügen, und es kann

auch animiert werden versuchen Sie so etwas wie:

- (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: ich schrieb es ohne eine IDE so könnte es einige Fehler

+0

Vielen Dank für die Antwort. Die verbleibenden Probleme sind: 1) 'cell.reuseIdentifier = CellIdentifier;' gibt mir den Fehler: "Zuweisung zur schreibgeschützten Eigenschaft". 2) Beim Klicken auf "Hinzufügen" bekomme ich einen weiteren Fehler über "ungültige Anzahl von Zeilen". Es scheint, dass die resultierende Anzahl von Zeilen immer noch 0 ist, wenn es 1 sein sollte. Irgendwelche Ideen? Außerdem - ich bin verwirrt über diese Zeile: Zelle = [[NSBundle MainBundle] loadNibNamed: @ "itemCell" Besitzer: Selbst Optionen: Nil]. LastObject; Wird die einzelne UITableViewCell in IB als eine Feder angesehen? – IkegawaTaro

+0

Sie können 'cell.reuseIdentifier = CellIdentifier' nicht ausführen. Legen Sie stattdessen den Wiederverwendungsbezeichner in der NIB "itemCell" fest. –

+0

Sorry über die Wiederbenutzungs-ID, Michael's Recht, setze es von der Spitze aus. Über den Fehler, ohne den Code auszuführen, weiß ich nicht, was damit nicht stimmt. Und eine Nib ist eine Datei mit XIB-Erweiterung, Sie sollten für Ihre 'itemCell' eine separate Nib-Datei erstellen. – Levi

Verwandte Themen