Warum ist die Steckdose von UICollectionViewCell gleich Null?


143

Ich habe im Interface Builder eine benutzerdefinierte UICollectionViewCell erstellt, Ansichten daran an die Klasse gebunden. Wenn ich dann eine Zeichenfolge für die Beschriftung der Zeichenfolge verwenden und festlegen möchte, hat diese Beschriftung den Wert Null.

override func viewDidLoad() {
    super.viewDidLoad()

    // Register cell classes
    self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
}

override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {

    var cell: LeftMenuCollectionViewCell
    cell = collectionView.dequeueReusableCellWithReuseIdentifier("ls", forIndexPath: indexPath) as LeftMenuCollectionViewCell
    println(cell.label) // <- this is nil, why??
    cell.label.text = "asd"

    return cell
}

Und die untergeordnete Zelle:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}

Gibt es einen Grund, warum Sie das explizite "!" zusätzlich zu Typnamen überall? Scheint überflüssig, besonders in den IBOutlets. Der einzige Ort, an dem es wichtig sein könnte, ist, wo Sie die Zelle als LeftmenuCollectionViewCell aus der Warteschlange entfernen, aber Sie tun es dort nicht. Können Sie die 'Zelle' selbst drucken oder NSLog?
mc01

1
Wenn ich "!" oder benutze "?" In der Klassendefinition erhalte ich einen Compilerfehler oder einen Absturz. "!" ist die Standardeinstellung, wenn Sie es binden.
János

Ameise die Zelle selbst: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; Rahmen = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
János

Alle Filialen in IB angeschlossen? Funktionieren die anderen Steckdosen? Ich sehe keine anderen offensichtlichen Probleme, sorry.
mc01

Antworten:


310

Ich rufe self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")wieder an. Wenn Sie ein Storyboard verwenden, möchten Sie dies nicht aufrufen . Es wird überschreiben, was Sie in Ihrem Storyboard haben.

Wenn Sie immer noch das Problem überprüfen , ob reuseIdentifierist dieselbe in dequeueReusableCellWithReuseIdentifier und in storyboard.


18
Danke dir! Verbrachte mehr als eine Stunde damit, wie mit einer benutzerdefinierten Zelle.
DogCoffee

Ich habe das gleiche Problem, aber nie diese Codezeile verwendet. Haben Sie eine Idee, warum ich die gleiche Ausnahme bekomme?
Dekel Maman

Vielen Dank. das hat es für mich gelöst. Ich hatte ein Storyboard und fügte manuell einen View Controller hinzu. Der Boilerplate-Code enthielt die von Ihnen erwähnte Zeile. Obwohl es korrekt schien (korrekte Kennung und Klasse), weigerte es sich, die Steckdosen anzuschließen. jetzt gehts. Süss!
Joris Weimar

13
Wenn Sie ein Storyboard verwenden, möchten Sie dies nicht aufrufen. Es wird überschreiben, was Sie in Ihrem Storyboard haben. <- Dieser
hilft

6
GAH, was für eine schreckliche Sache in der UICollectionViewController-Vorlage zu haben !!!!! Danke, Janos.
Kenny Wyland

53

Entfernen Sie einfach diese Zeile:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")

3
Ich verstehe nicht, warum dies abgelehnt wurde. Dies war die Antwort auf mein Problem.
Félix Simões

1
Dies ist die richtige Antwort und sollte von der Person, die die Frage gestellt hat, entsprechend gekennzeichnet werden. Wäre auch toll zu verstehen, warum es funktioniert :)
Kiko Lobo

3
Vermutlich wurde es abgelehnt, weil die Frage im August 14 selbst beantwortet wurde ... während diese Antwort die Antwort hier nach einigen Monaten nur noch einmal kopiert.
Nitin Nain

1
Aber wenn ich es nicht benutze, gibt es mir Fehler Assertion Fehler in - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
Shaheera

Eine Erklärung, warum diese Zeile nicht benötigt wird, wäre willkommen. Es wird derzeit vom Xcode-Boilerplate für eine neue Sammlungsansicht hinzugefügt.
pkamb

47

Wenn Sie xib verwenden, stellen Sie sicher, dass Sie diese Codezeile zu Ihrem viewdidload hinzugefügt haben.

Ziel c:

[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"MyCellIdentifier"];

Schnell:

collectionView.register(UINib(nibName:"MyCell", bundle: nil), forCellWithReuseIdentifier:"MyCellIdentifier")

Müssen Sie sowohl Klasse als auch Feder registrieren, oder reicht nur Feder aus?
RainCast

3
Ich habe gerade die Feder registriert und sie hat meine Probleme gelöst.
Amelia

Es gibt anscheinend zwei Möglichkeiten, sich zu registrieren, und ich habe die falsche verwendet ... collectionView? .Register (UINib (nibName: "YourItemClassName", Bundle: nil), forCellWithReuseIdentifier: "yourIdentifier") collectionView? .Register (YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier")
Sergio

17

Muss die Feder Jungs registrieren!

collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCellId")

6

Es gibt anscheinend zwei Möglichkeiten, sich zu registrieren, und ich habe zuerst die falsche verwendet. Ich habe eine benutzerdefinierte xib-Ansicht, die mit der zweiten Option registriert ist, und wir haben Daten!

1:

collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier") 

2:

collectionView?.register(UINib(nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")

0

Ich hatte ein ähnliches Problem, aber mein Fehler war, dass ich CollectionViewCell nicht delegiert habe, um den Beschriftungstext ändern zu können.


0

Ich denke, dass die beste Lösung darin besteht, direkt aus dem Storyboard zu verwenden, wo ein hinzugefügt CollectionViewwird. Alternativ müssen Sie ein entfernenCollectionViewCell aus Ihrem CollectionViewStoryboard und eine Zelle mit dem folgenden Befehl registrieren:

collectionView? .register (UINib (nibName: "YourItemClassName", Bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.