2016-03-29 17 views
0

Wann werden Steckdosen an eine UITableViewCell-Instanz gebunden? Wenn ich myLabel im Debugger zu drucken, ist es null und Drucke:UITableViewCell-Steckdosen

fatal error: unexpectedly found nil while unwrapping an Optional value

class MyTableViewCell: UITableViewCell { 
    @IBOutlet var myLabel: UILabel! 

override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    print("\(myLabel)") 
} 
} 
+0

Versuchen Sie '@IBOutlet schwach var myLabel: UILabel!' – boidkan

+1

'weckenFromNib' wird aufgerufen, sobald sie verbunden sind – dan

+0

Mein Verständnis ist, dass @IBOutlet implizit schwach ist. – user3246173

Antwort

2

Outlets sind noch nicht gesetzt, wenn die init-Methode Ihrer Tableview-Zelle aufgerufen wird!

Ich bin mir nicht sicher, was Ihre Absicht ist:

  1. Wenn Sie sicherstellen möchten, dass Sie keine Null optional Wert Abwickeln nur if let wie folgt verwenden:

    if let label = myLabel { 
        print("\(label)") 
    } 
    
  2. Wenn Wenn Sie die Zelle Ihrer tableView einrichten möchten, sollten Sie zuerst die Zelle registrieren, indem Sie tableView.registerNib(UINib(nibName: "MyTableViewCell", bundle: nil), forCellReuseIdentifier: "reuse") aufrufen. Dann dequeue die Zelle in cellForRowAtIndexPathtableView.dequeueReusableCellWithIdentifier("reuse") mit und stellen Sie sicher, stellen Sie die Werte Ihrer Zelle in awakeFromNib:

    override func awakeFromNib() { 
        super.awakeFromNib() 
    
        //you can be sure that myLabel is initialzed here 
        print("\(myLabel)") 
    } 
    
-1

Das Problem ist, dass Sie in einem Fall ausgeführt werden, wo myLabel Null ist. Es könnte sein, während die Tabellenansichtszelle recycelt wird.

+0

Untersichten werden bei der Wiederverwendung nicht zerstört, es sei denn, dies wird explizit in -prepareForReuse getan. Der Sinn des Recyclings ist es, diesen Overhead überhaupt zu beseitigen. Alle Elemente, die vom Schnittstellen-Generator hinzugefügt wurden, werden in der Zeit, in der -awakeFromNib aufgerufen wird, instanziiert und sind weiterhin verfügbar, bis sie explizit entfernt oder die Zuordnung der Zelle aufgehoben wird. -dequeueReusableCellWithIdentifier initialisiert entweder eine neue Zelle oder gibt eine vorhandene Zelle mit allen Unteransichten aus dem Storyboard zurück. – Dare

0

Wenn Sie einen Austritt aus dem Hauptstoryboard anschließen, Ihr Problem auftreten könnte, wenn der Ausgang ist versehentlich gelöscht Erstellen Sie die Steckdose neu und das Etikett wird nicht mehr Null sein.