it-swarm.com.de

Schwerwiegender Fehler: Beim Entpacken optionaler Werte wurde unerwartet nichts gefunden

Ich habe in Swift eine UICollectionView verwendet, aber ich bekomme es, wenn ich versuche, den Text der Beschriftung der Zelle zu ändern.

    func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int
{
    return 5
}

func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell!
{
    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("title", forIndexPath: indexPath) as TitleCollectionViewCell
    // Next line: fatal error: unexpectedly found nil while unwrapping an Optional value
    cell.labelTitle.text = "This is a title"
    return cell
}

Weiß jemand davon?

 Screenshot for warning on Console

120
rulilg

Ihre Wiederverwendungskennung "title" ist mit großer Wahrscheinlichkeit falsch.

Aus der UITableView.h-Methodensignatur von dequeueReusableCellWithIdentifier können wir erkennen, dass der Rückgabetyp ein implizit nicht verpacktes optionales ist:

func dequeueReusableCellWithIdentifier(identifier: String!) -> AnyObject! // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.

Das wird durch das Ausrufezeichen nach AnyObject bestimmt:

    AnyObject!

Das erste, was zu beachten ist: Was ist ein "implizit nicht verpacktes optionales Produkt"?

Die Programmiersprache Swift sagt uns:

Manchmal ist aus der Programmstruktur ersichtlich, dass ein optionaler Wille habe immer einen Wert, nachdem dieser Wert zuerst festgelegt wurde. In diesen Fällen ist es ist nützlich, um die Notwendigkeit zu beseitigen, den Wert des optionalen Werts zu überprüfen und zu entpacken. jedes Mal, wenn darauf zugegriffen wird, da davon ausgegangen werden kann, dass sie eine. Wert die ganze Zeit.

Diese Arten von Optionen werden als implizit unverpackt definiert optionals. Sie schreiben ein implizit nicht verpacktes optionales Element, indem Sie ein .__ eingeben. Ausrufezeichen (String!) und nicht ein Fragezeichen (String?) nach der Typ, den Sie optional machen möchten.

Also im Grunde etwas, das an einem Punkt gleich Null gewesen sein könnte, das aber ab einem bestimmten Zeitpunkt nie wieder Null ist. Wir ersparen uns deshalb etwas Mühe, indem wir es als unverpackten Wert betrachten.

In diesem Fall ist es sinnvoll, dass dequeueReusableCellWithIdentifier einen solchen Wert zurückgibt. Der bereitgestellte Bezeichner muss bereits zum Registrieren der Zelle für die Wiederverwendung verwendet worden sein. Geben Sie einen falschen Bezeichner an, der Dequeue kann ihn nicht finden und die Laufzeit gibt eine Null zurück, die niemals passieren darf. Es ist ein schwerwiegender Fehler, die App stürzt ab und die Konsolenausgabe gibt Folgendes aus:

fatal error: unexpectedly found nil while unwrapping an Optional value

Fazit: Überprüfen Sie den in der .storyboard, Xib oder im Code angegebenen Bezeichner für die Wiederverwendung von Zellen und stellen Sie sicher, dass er beim Entreißen korrekt ist. 

78
Max MacLeod

Sie können den Absturz verhindern, indem Sie cell.labelTitle mit einer if let-Anweisung sicher auspacken. 

if let label = cell.labelTitle{
    label.text = "This is a title"
}

Sie müssen jedoch noch ein wenig debuggen, um zu sehen, warum Sie dort einen Nullwert erhalten.

101
Connor

Prüfen Sie, ob die Zelle bei self.collectionView.registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String) registriert ist. Wenn ja, dann entfernen Sie diese Codezeile.

Weitere Informationen finden Sie in dieser Antwort: Warum ist der Ausgang von UICollectionViewCell gleich Null?

"Wenn Sie ein Storyboard verwenden, möchten Sie das nicht nennen. Es wird das überschreiben, was Sie in Ihrem Storyboard haben."

25
Ron Fessler

Ich weiß nicht, ob es ein Fehler oder etwas ist, aber Ihre Beschriftungen und andere UIs werden nicht automatisch initialisiert, wenn Sie eine benutzerdefinierte Zelle verwenden. Sie sollten dies in Ihrer UICollectionViewController-Klasse versuchen. Es hat für mich funktioniert.

override func viewDidLoad() {
    super.viewDidLoad()

    let nib = UINib(nibName: "<WhateverYourNibName>", bundle: nil)
    self.collectionView.registerNib(nib, forCellReuseIdentifier: "title")
}
19
greeninaqua

Ersetzen Sie diese Zeile cell.labelTitle.text = "This is a title"
mit cell.labelTitle?.text = "This is a title" 

12
iOS Developer

Ich habe seine Fehlermeldung erhalten, als ich versuchte, auf UILabel zuzugreifen. Ich habe vergessen, die UILabel mit der IBOutlet im Storyboard zu verbinden, was dazu führte, dass die App mit diesem Fehler abstürzte !!

6
Pruthvid

Ich hatte auch dieses Problem und das Problem lag in den View-Controllern. Ich bin mir nicht sicher, wie Ihre Bewerbung strukturiert ist, daher erkläre ich einfach, was ich gefunden habe. Ich bin ziemlich neu mit Xcode und Codierung, also bleib bei mir.

Ich habe versucht, den Text auf einem UILabel programmgesteuert zu ändern. Die Verwendung von "self.mylabel.text" funktionierte gut, bis ich einen anderen View-Controller unter derselben Klasse hinzufügte, der dieses Label nicht enthielt. Dann habe ich den Fehler, den Sie sehen. Als ich dasselbe UILabel hinzugefügt und in diesen zusätzlichen View-Controller eingebunden habe, war der Fehler nicht mehr vorhanden.

Kurz gesagt, es scheint, dass in Swift alle View-Controller, die derselben Klasse zugeordnet sind, auf den Code verweisen müssen, den Sie dort gespeichert haben. Andernfalls erhalten Sie einen Fehler. Wenn Sie zwei unterschiedliche Ansichtscontroller mit unterschiedlichem Code haben, weisen Sie sie verschiedenen Klassen zu. Das hat für mich funktioniert und gilt hoffentlich für das, was Sie tun.

3
ClareHuxtable

schwerwiegender Fehler: Beim Entpacken eines optionalen Werts wurde unerwartet nichts gefunden

  1. Überprüfen Sie die IBOutlet-Auflistung, da durch diesen Fehler die Verwendung nicht verbundener Berechtigungsobjektobjekte möglicherweise beeinträchtigt wird. 

:) hofft, dass es für ein paar Leute, die Schwierigkeiten haben, helfen wird. 

2
Kishore Kumar

Ich hatte das gleiche Problem mit Xcode 7.3. Meine Lösung bestand darin, sicherzustellen, dass meine Zellen die richtigen Wiederverwendungskennungen hatten. Setzen Sie im Abschnitt Tabellenansicht die Zelle Tabellenansicht auf den entsprechenden Bezeichnernamen, den Sie im Programm verwenden, stellen Sie sicher, dass sie übereinstimmen.

1
ekeith

Es kann auch ein Null-Koaleszenz-Operator verwendet werden.

rowName = rowName != nil ?rowName!.stringFromCamelCase():""
1
Abhijeet

Ich habe selbst nach einer Lösung gesucht. Nur mein Problem war auf UITableViewCell Not UICollectionView als Ihre Erwähnung hier bezogen. 

Zunächst einmal bin ich neu in der iOS-Entwicklung. Wie neu, ich sitze hier und versuche, durch mein erstes Tutorial zu kommen, also nimm mein Wort nicht für irgendetwas. (sofern es nicht funktioniert;))

Ich bekam einen Null-Verweis auf cell.detailTextLabel.text - Nachdem ich das Video des Tutorials erneut angesehen hatte, sah es nicht so aus, als hätte ich etwas verpasst. Also habe ich die Header-Datei für die UITableViewCell eingegeben und diese gefunden. 

var detailTextLabel: UILabel! { get } // default is nil. label will be created if necessary (and the current style supports a detail label).

Ich habe also festgestellt, dass es heißt (und der aktuelle Stil unterstützt ein Detailetikett) - Nun, der benutzerdefinierte Stil hat standardmäßig kein detailLabel. Also musste ich einfach den Stil der Zelle im Storyboard ändern, und alles war gut. 

Ich schätze, Ihr Label sollte immer da sein?

Wenn also der folgende Hinweis von connor heißt, bedeutet das WENN das Label verfügbar ist, dann verwenden Sie es. Wenn Ihr Stil korrekt eingerichtet ist und der Wiederverwendungsbezeichner mit dem im Storyboard festgelegten übereinstimmt, sollten Sie diese Prüfung nur durchführen, wenn Sie mehr als eine benutzerdefinierte Zelle verwenden.

1
Christer

Dieselbe Nachricht hier, aber mit einer anderen Ursache. Ich hatte eine UIBarButton, die ein Segue auslöste. Dem Segue fehlte eine Kennung.

0
David DelMonte

Ich hatte das gleiche Problem und der Grund dafür war, dass ich versuchte, einen UIImage mit dem falschen Namen zu laden. Überprüfen Sie .setImage(UIImage(named: "-name-"-Aufrufe und stellen Sie sicher, dass der Name korrekt ist.

0
Hugo Sequeira