2013-03-20 5 views

Antwort

0

Ich werde zwei Optionen beschreiben: die Zelle Hinzufügen von mit Interface Builder (einfacher), und das Hinzufügen der Zelle programmatisch:

Durch die Verwendung von Interface Builder

Sobald Sie die Zelle in-Schnittstelle erstellt haben Builder und hinzugefügte Unteransichten mit Ihrem benutzerdefinierten Inhalt, öffnen Sie den Inspektor Attribute, wählen Sie die Benutzerdefiniert Stil und geben Sie eine eindeutige Kennung in die Reuse-Kennung Textfeld (zum Beispiel "anIdentifier"). Wählen Sie als nächstes die Zellenfelder aus, auf die Sie programmgesteuert zugreifen möchten, und legen Sie für jedes Element eine eindeutige -Nummer fest (unter der Ansicht Abschnitt).

Dann in der Datenquelle Code, implementieren diese Methode:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"anIdentifier"]; 

    UILabel *label; 

    label = (UILabel *)[cell viewWithTag:1]; // Set a constant for this so your fellow developers understand this number 
    label.text = @"This is a test"; 

    return cell; 
} 

Programmatically

Wenn Sie die Zelle programmatisch erstellt werden soll, dann sollte der Code etwas Ähnliches wie dieses:

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

    static NSString *CellIdentifier = @"anIdentifier"; 

    UILabel *aLabel; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]]; 

     aLabel = [[[UILabel alloc] initWithFrame:...]]; 
     aLabel.tag = 1; // Set a constant for this 
     aLabel.font = [UIFont systemFontOfSize:14.0]; 
     aLabel.textAlignment = UITextAlignmentRight; 
     aLabel.textColor = [UIColor blackColor]; 
     aLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview:mainLabel]; 
    } else { 
     aLabel = (UILabel *)[cell.contentView viewWithTag:1]; 
    } 

    aLabel.text = @"This is a test"; 

    return cell; 
} 

Weitere Informationen finden Sie auf der Apple-Website: http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/tableview_iphone/TableViewCells/TableViewCells.html

+0

UITextAlignment ... ist veraltet. Sie sollten stattdessen NSTextAlignment ... verwenden. Wow, ich lese gerade diese Apple Docs. Sagen sie dir wirklich, ALLES an einen Ort zu bringen !? Es macht die Dinge so viel unordentlicher und komplizierter. Was, wenn Sie dieselbe Zelle an einem anderen Ort verwenden möchten? Du kopierst den ganzen Code? LOL! – Fogmeister

+1

Ab iOS 6 'dequeueReusableCellWithIdentifier:' wird 'nil' nicht mehr zurückgeben. Sie erhalten automatisch eine neue oder wiederverwendete Zelle. Wenn dies Ihr minimales Bereitstellungsziel ist, können Sie das 'if' /' else'-Konstrukt verlassen. –

+0

Daniel, das ist nur der Fall, wenn du eine Klasse (oder eine Nib) für die Wiederverwendungs-ID gemäß meiner Antwort registriert hast. Wenn Sie keine Klasse registriert haben, wird eine Nullzelle zurückgegeben. – Fogmeister

8

Ich würde vermeiden, Layout und Aufbau Ihrer Zelle in cellForRowAtIndexPath setzen.

Um eine benutzerdefinierte Zelle programmatisch zu erstellen, sollten Sie zuerst eine UITableViewCell Unterklasse erstellen.

Fügen Sie die labels, imageViews, etc ... Fügen Sie die als subViews der cell.contentView.

Programatically

dh

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     _label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 21)]; 
     [self.contentView addSubview:_label]; 
    } 
    return self; 
} 

Wenn Sie das Layout Material der Zelle dann in der MyCell Klasse tun möchten Sie tun können ...

- (void)layoutSubViews 
{ 
    [super layoutSubviews]; 
    // layout stuff relative to the size of the cell. 
} 

dann in der tableViewController müssen Sie die Zellklasse ...

registrieren

In viewDidLoad ...

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

MIT INTERFACE BUILDER

noch der benutzerdefinierten Unterklasse erstellen, sondern auch eine xib Datei mit dem gleichen Namen erstellen.Dann können Sie in Ihrer XIB-Datei die Steckdosen anschließen, anstatt sie in der Initialisierung der Zelle zu erstellen. (Wenn du es so machst, wird die Init sowieso nicht aufgerufen).

Die einzige andere Änderung, die Sie brauchen, ist, dass in viewDidLoad Sie die Feder für die Zelle nicht die Klasse registrieren müssen.

So ...

UINib *cellNib = [UINib nibWithNibName:@"MyCell" bundle:nil]; 
[self.tableView registerNib:cellNib forCellReuseIdentifier:@"MyCellIdentifier"]; 

Dann funktioniert alles andere gleich.

ZELLEN weiter verwenden

Um die Zelle zu verwenden, die Sie die Unterklasse für ...

es auf diese Weise tun bedeutet

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"]; 

    [self configureCustomCell:(MyCell*)cell atIndexPath:indexPath]; 

    return cell; 
} 

- (void)configureCustomCell:(MyCell*)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    // do all you logic of getting any info from arrays etc in here. 

    cell.label.text = @"Blah". 
} 

Zusammenfassung erstellt haben, dass Ihr Tableviewcontroller ist nur daran interessiert, Sachen in die Zellen zu stecken. Wenn Sie all Ihre Logik für den Aufbau Ihrer Zellen verwenden, wird auch alles sehr unordentlich.

Es bedeutet auch, dass Sie nicht mit vielen verschiedenen Tags umgehen müssen, um verschiedene UI-Elemente zu speichern und abzurufen.

Verwandte Themen