2014-01-28 7 views
6

Erste Schritte mit UICollectionView. Ich habe IB verwendet, um eine einfache UICollectionView in einem UIViewController zu erstellen. Es scrollt horizontal mit Paging. Ich habe eine einfache UICollectionViewCell innerhalb der UICollectionView platziert. Ich habe die Wiederverwendungs-ID für die Zelle festgelegt.viewWithTag gibt beim Initialisieren einer UICollectionViewCell null zurück.

Ich legte eine UILabel mit einem Tag von 100 innerhalb der UICollectionViewCell.

In viewDidLoad, rufe ich:

[_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Thing"]; 

Später ich versuche, die Zelle zu initialisieren, wie so:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Thing" forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor greenColor]; 

    UILabel *nameLabel = (UILabel *)[cell viewWithTag:100]; 
    nameLabel.text = @"Bogus"; 

    return cell; 
} 

Wenn ich laufen die App, die Ansicht korrekt geladen; Ich kann horizontal durch die 2 Zellen scrollen. Ich sehe die hässliche grüne Farbe, die jede Zelle identifiziert.

Die Methode viewWithTag gibt jedoch nil zurück und daher wird der NameLabel-Text nicht festgelegt.

Warum?

Beachten Sie, dass ich auch versucht habe, eine benutzerdefinierte Unterklasse von UICollectionViewCell zu definieren und registerClass damit aufzurufen. In IB ändere ich die Zellklasse in die benutzerdefinierte Unterklasse und binde die UILabel an die UILabel Steckdose in der Unterklasse.

Aber das funktioniert auch nicht. (Ich würde den Ansatz der benutzerdefinierten Unterklasse sowieso vermeiden, da es nicht notwendig erscheint, Klassen zu definieren, nur um IBOutlets zu halten.)

Ich denke, dass ich etwas offensichtlich hier vermisse.

ähnliches Problem hier beschrieben:

Trouble accessing Image from instance of UICollectionViewCell

+0

Wo erstellen Sie das UILabel? – Odrakir

+0

Das UILabel wird in Interface Builder konfiguriert. Ich erwarte nicht, es im Code zuzuteilen. Ich dachte, dass viewWithTag die erstellte Instanz abrufen sollte. So funktioniert es mit UITableView. – Daniel

+0

Haben Sie den reuseIdentifier für den Prototyp CollectionViewCell in Ihrer Schreibfeder zugewiesen? – chandu

Antwort

26

Entfernen Sie die registerClass-Zeile. Du machst es auf dem Storyboard, also brauchst du es nicht.

+0

Das funktioniert für mich. –

+0

Warum sollten sie das Standardverhalten machen, um das sh * t von Entwicklern zu verwirren? Verwenden die meisten Leute das Storyboard nicht ??? –

1

es versuchen

UILabel *nameLabel = (UILabel *)[cell.contentView viewWithTag:100];

Update:

Sie können die Hierarchie der Zelle aussehen und alle Tag seiner subview suchen: [self showAllSubView:cell] ;, können findest du dein Label mit dem Tag 10?

- (void)showAllSubView:(UIView *)view 
{ 
    for (UIView * subView in [view subviews]) { 
     NSLog(@"%@, tag:%d", subView, subView.tag) ; 
     [self showAllSubView:subView] ; 
    } 
} 
+1

Hatte das auch versucht - hat nicht funktioniert.Versucht noch einmal für Tritte - immer noch kein Glück – Daniel

+0

@Daniel Ich habe meine Antwort aktualisiert, es kann helfen, zu finden, ob das Etikett auf der Hierarchie der Zelle ist. – KudoCC