2015-03-17 19 views
25

Betrachten Sie das folgende einfache View-Controller:Benutzerdefinierte Tabellenansicht Zelle: IBOutlet Etikett ist gleich Null

class ViewController: UIViewController, UITableViewDataSource { 
    @IBOutlet weak var tableView: UITableView! 

    var items = ["One", "Two", "Three"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell") 
     self.tableView.dataSource = self 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.items.count; 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = self.tableView.dequeueReusableCellWithIdentifier("customCell") as CustomTableViewCell 
     cell.titleLabel!.text = self.items[indexPath.row] 
     return cell 
    } 
} 

und benutzerdefinierte Zelle Ansicht:

class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var titleLabel: UILabel! 
} 

Dieser Code verursacht den folgenden Fehler.

fatal error: unexpectedly found nil while unwrapping an Optional value

titleLabel ist nicht - es ist nicht klar, warum. Das Einstellen der Standardeigenschaften von UITableViewCell (wie textLabel) funktioniert einwandfrei.

Ich benutze eine Feder für die benutzerdefinierte Zelle.

Sowohl die Etiketten als auch die Tabellenansichten sind korrekt mit ihren IBOutlet s verbunden.

label table view

Sowohl die Prototyp-Zelle und die benutzerdefinierte Spitze Ansicht werden als mit einer CustomTableViewCell Klasse markiert.

Ich bin neu in der iOS-Entwicklung, vermisse ich etwas offensichtlich?

Sample XCode project available.

+0

Ist die Zelle hier nicht null? (lost cell = self.tableView.dequeueReusableCellWithIdentifier ("customCell") als CustomTableViewCell) – iOSfleer

+0

Sie haben die Warnung "/ Main.storyboard:64: Prototyp-Tabellenzellen müssen Wiederverwendungskennungen" bemerkt? –

+0

@ThomasKilian Das Hinzufügen einer Wiederverwendungskennung im Inspektor Attribute entfernt die Warnung, hat jedoch keine Auswirkungen auf das Problem. –

Antwort

38

Zunächst verwenden Sie eine NIB-Datei, um Ihre benutzerdefinierte Zelle in die Tabelle zu laden. Das wird wahrscheinlich mehr Kopfschmerzen als es wert ist, wenn Sie neu in Swift/Cocoa sind. Ich würde vorerst alles auf das Storyboard verschieben. Anstatt eine Nib-Datei, klicken Sie verwenden, um Storyboard zu gehen, klicken Sie auf Ihre UITableView und stellen sicher, dass die Inhalte Einstellung des Tableview ist Dyanamic Prototypes:

enter image description here

Als nächstes klicken Sie auf den Prototyp Zelle (die einzige in der Tabellenansicht) und stellen Sie die Klasse zu CustomTableViewCell und legen Sie seine Wiederverwendung Kennung customCell:

enter image description here enter image description here

nächstes ein Label zu Ihrem Prototyp Zelle hinzufügen und Verbinden Sie es mit dem IBOutlet in Ihrer CustomTableViewCell Klasse. Sie müssen Ihre customCell nicht registrieren, solange Sie die Wiederverwendungs-ID im Storyboard festgelegt haben. Löschen Sie diese Zeile:

self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell") 

und es sollte laufen.

+0

Ich habe diese Zeile auskommentiert, das Problem ist immer noch vorhanden. (Es gibt keine Warnungen und die Wiederbenutzungskennung ist im Attribut-Inspektor korrekt eingestellt.) –

+0

Oh, ich sehe, Sie verwenden eine Feder für Ihre CustomViewCell. Sie müssen das in der Frage erwähnen, dass es irreführend ist. Gibt es irgendeinen Grund dafür, dass du nicht nur die Zelle im Storyboard generiert hast? – kellanburket

+0

Oh, Entschuldigung, ich nahm an, dass dies die einzige Möglichkeit war (nach einem Tutorial). Die Frage wurde aktualisiert. Glücklich, es anders zu machen. –

4

Sie sollten dequeueReusableCellWithIdentifier:forIndexPath verwenden, um die Zellen aus der Warteschlange zu entfernen.

Wenn Sie Storyboard zum Erstellen der Zellen verwenden, sollten Sie die Klasse nicht zur Wiederverwendung registrieren müssen, da das Storyboard dies für Sie erledigt, wenn Sie reuseIdentifier festlegen.

+0

Das repariert es nicht, dasselbe Problem.Ich habe das Beispiel-XCode-Projekt in der Frage mit Ihrem Vorschlag aktualisiert. –

+0

Hast du 'self.tableView.delegate = self' irgendwo? Scheint zu fehlen in 'viewDidLoad'? Sie ordnen den dataSource-Delegaten, aber nicht den Delegaten zu? –

+0

Ich habe nur deine Quelle angeschaut. Sie haben keinen Delegierten wie oben erwähnt und keine Methoden für heightForRowAtIndexPath etc ... Dies wird nicht helfen. –

-5

Funktioniert für mich ohne!

EDIT

let challenge = self.challenges![indexPath.row] 

    let title = challenge["name"] 
    if title != nil { 
     cell.titleLabel.text = title 
    } 
+0

Was ist Titel? Klar, nur nach Nil zu suchen wird funktionieren, aber das Problem wird vollständig behoben. –

+0

Es war nur eine Probe, ich habe meinen Beitrag bearbeitet, um zu verstehen. – iOSfleer

26

versuchen diese

import UIKit 

class ViewController: UIViewController, UITableViewDataSource { 
    @IBOutlet weak var tableView: UITableView! 

    var items = ["One", "Two", "Three"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.registerNib(UINib(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "customCell")// CustomTableViewCell.self, forCellReuseIdentifier: "customCell") 
     self.tableView.dataSource = self 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.items.count; 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = self.tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as CustomTableViewCell 
     cell.titleLabel!.text = self.items[indexPath.row] 
     return cell 
    } 
} 
+0

Das scheint das Problem. Vielen Dank. –

+3

Dies ist die offensichtliche Antwort hier. Da Sie Ihre Zelle auf einer Nib aufbauen, müssen Sie diese Zelle mit der entsprechenden Methode registrieren. registerNib statt registerClass ... –

+0

Seit Stunden auf der Suche nach dieser Lösung – tarrball

0

Bitte stellen Sie sicher, dass Sie keinen Fehler machen, während die Spitze (benutzerdefinierte Zelle) in der viewDidLoad Registrierung. Nib name und reuseIdentifiers sollten nicht falsch sein.

-2

Der Ausgang in Ihrer CustomTableViewCell muss eine starke Referenz haben.

ersetzen

@IBOutlet weak var titleLabel: UILabel! 

mit

@IBOutlet var titleLabel: UILabel! 
0

wie dies Ihre Feder registrieren:

let bundle = Bundle(for: type(of: self)) 
let nib = UINib(nibName: "PickerCell", bundle: bundle) 
collectionViewPicker.register(nib, forCellWithReuseIdentifier: "cell") 
+0

Es funktioniert gut für mich. – Arnav

Verwandte Themen