Es tut mir leid, noch eine andere "gefunden nil Unwrapping optional in TableViewCell" Posting, aber nach Stunden des Debuggens und lesen andere solche Beiträge hier, ich bin immer noch fest. Ich denke, ich habe alle üblichen Fehler behandelt, kann aber immer noch nicht alles zum Laufen bringen.xcode 7 Swift gefunden nil beim Auspacken optional in einer Tabellenansicht Zelle
Als Ausgangspunkt funktioniert alles einwandfrei, solange ich die Standardbezeichnung in der Zelle verwende, auf die mit "cell.textLabel! .text = mystring" verwiesen wird. Und ich habe einen anderen Fall, in dem ich die Prototypzelle mit einem Bild und einem Etikett anpasste, und das hat auch gut funktioniert.
Im aktuellen Fall habe ich einen normalen UIViewController, mit einigen anderen Ansichten und einem UITableView eingebettet. Der normale UIViewController wird als Delegat für die Zellen festgelegt.
Hier ist der Code SettingsCell.swift. Ziemlich einfach. Der kleine Punkt auf der linken Seite des Outlet in xcode ist durchgehend und zeigt an, dass der Ausgang ordnungsgemäß mit dem CellTwo-Etikett an meiner Prototyp-Tischzelle verbunden ist.
class SettingsCell: UITableViewCell {
@IBOutlet weak var CellTwo: UILabel!
override init(style: UITableViewCellStyle, reuseIdentifier reuseID: String?) {
super.init(style: style, reuseIdentifier: reuseID)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Im entsprechenden SettingsVC.swift View-Controller, hier ist der dequeueCell Code, der auf den Versuch, um den cell.CellTwo Wert der Null Fehler nimmt.
Die Zellen werden in der Tabellenansicht ordnungsgemäß angezeigt, es wird jedoch nur der StandardtextLabel.txt angezeigt, der Teil von UILabel ist. Mein benutzerdefiniertes Label wird nicht angezeigt.
func tableView(
tv: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tv.dequeueReusableCellWithIdentifier("SettingsCell") as! SettingsCell
let row = indexPath.row
cell.textLabel!.text = SettingsNames[row]
// the commented out line below crashes on a nil unwrapped optional
// cell.CellTwo!.text = "Blah"
if let b = cell.CellTwo {
b.text = "Blah"
}
return cell
}
Mit dem kleinen „lassen b =“ optional unwrap nil Schutz, ist die App nicht abstürze, aber mein zweites Etikett entweder bekommt nicht gesetzt. Betrachten wir schließlich die Registrierung der Klasse.
Viele Beispiele existieren im Netz (ohne Prototypen zu verwenden), wo Sie die Klasse registrieren, und ich habe das vorher erfolgreich getan. Und ich habe ein Beispiel gemacht, wo ich eine benutzerdefinierte Prototyp-Zelle gebaut habe, und die hat auch gut funktioniert. Aber ... ich denke, all diese Beispiele verwendeten einen UITableViewController, keinen normalen UIViewController + Embedded UITableView. Vielleicht hat das etwas damit zu tun.
Wie auch immer, hier ist der init/viewDidLoad-Code im UIViewController, der das UITableView enthält. Wie Sie aus dem Code entnehmen können, beansprucht der UIViewController die Verantwortung für die Datenquelle und die Delegierten, und tatsächlich erscheinen die Tabellenzeilen und funktionieren gut.
Ich habe versucht Registrierung in beide Richtungen - ohne die Coderegistrierung und mit der Code-Registrierungszeile. Aber es macht überhaupt keinen Unterschied - mein Code stürzt immer noch auf dem Null-Verweis auf mein benutzerdefiniertes Label in der Zelle ab.
class SettingsVC: UIViewController, UITableViewDataSource, UITableViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
SettingsTV.dataSource = self
SettingsTV.delegate = self
// I tried with this line in and out, no difference, the crash still happens
//SettingsTV.registerClass(SettingsCell.self, forCellReuseIdentifier: "SettingsCell")
SettingsTV.estimatedRowHeight = 70
}
Es ist wie meine benutzerdefinierte Label irgendwie nicht erstellt oder initialisiert wird. Aber ich kann es nicht erklären. Irgendwelche Ideen? Danke
Haben Sie in Ihrem Storyboard die Klasse Ihrer Prototypzelle in 'SettingsCell' geändert? Versuchen Sie auch, die Steckdose zu trennen und wieder anzuschließen, manchmal brechen sie. Versuchen Sie schließlich, Ihre Zelle in 'cellForRowAtIndexPath' folgendermaßen zu erstellen:' let cell = tableView.dequeueReusableCellWithIdentifier ("SettingsCell", forIndexPath: indexPath) ' – Wes
Vielen Dank für Ihre Hilfe. Ich bestätige: Ja, die Storyboard-Prototypzelle ist an die SettingsCell-Klasse gebunden. Ich habe die Steckdose wieder getrennt/wieder angeschlossen (ich stimme zu, manchmal gehen sie wackelig und brechen). Und ich habe meine "tv" local var in tableView.dequeue geändert, wie Sie es gewünscht haben. Leider keine Änderung der Ergebnisse. Wenn ich versuche, cell.CellTwo einen Wert zuzuweisen, dauert es einen Null-Fehler. Es sieht so aus, als ob ich die "entschaufelte" (frisch erstellte) Zelle in eine SettingsCell umwandeln würde, in der Erwartung, dass die Zelle tatsächlich eine SettingsCell ist, wobei der Ausgang den eigentlichen Label-Speicher ersetzt. Aber es ist nicht wirklich da. – Kevin
Haben Sie die Wiederverwendungs-ID im Storyboard festgelegt? –