Erreur fatale: trouvé de manière inattendue nil lors du déballage d'une valeur optionnelle

J'essaye d'exécuter ce code mais je continue à get cette erreur:

Erreur fatale: trouvé de manière inattendue nil lors du déballage d'une valeur optionnelle

Je ne comprends pas ce que cela signifie ou pourquoi je l'obtiens. Un indice?

import UIKit class ViewController: UIViewController { var lastNumber: Ssortingng = "" @IBOutlet var answerField: UILabel @IBOutlet var operaterLabel: UILabel override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func buttonTapped(theButton: UIButton) { if answerField.text == "0" { answerField.text = theButton.titleLabel.text } else { answerField.text = answerField.text + theButton.titleLabel.text } } @IBAction func plusTapped(theButton: UIButton) { // error is talking about the next line if operaterLabel.text == "" { operaterLabel.text = "+" lastNumber = answerField.text answerField.text = "0" } else { enterTapped(nil) operaterLabel.text = "+" } } @IBAction func minusTapped(theButton: UIButton) { if operaterLabel.text == "" { operaterLabel.text = "-" lastNumber = answerField.text answerField.text = "0" } else { enterTapped(nil) operaterLabel.text = "-" } } @IBAction func clearTapped(AnyObject) { answerField.text = "0" operaterLabel.text = "" lastNumber = "" } @IBAction func enterTapped(AnyObject?) { var num1 = lastNumber.toInt() var num2 = answerField.text.toInt() if !num1 || !num2 { showError() return } var answer = 0 if operaterLabel.text == "-" { var answer = num1! - num2! } else if operaterLabel.text == "+" { var answer = num1! + num2! } else { showError() return } answerField.text = "\(answer)" } func showError() { println("Ther was an error") } } 

l'erreur fait reference au fait que vous accédez au paramètre d'une valeur facultative lorsque la valeur facultative est définie sur nil (par exemple, en accédant à answerField.text lorsque answerField est nul), probablement l'un de vos deux UILabels .

Si la ligne operaterLabel.text == "" lève l'exception, alors votre operaterLabel est nul. Vérifiez que vous l'avez correctement connecté à l'label dans votre file Interface Builder.

Dans mon cas, j'essayais d'accéder aux labels dans une fonction que j'avais créée qui était utilisée après l'set d'une variable.

 var something: Ssortingng { didSet { updateUI() } } func updateUI() { label.text = "Hello" } 

Je l'ai résolu en:

 var something: Ssortingng override func viewDidLoad() { label.text = "hello" } 

Ma théorie est que ma fonction updateUI a été accédée avant que les vues et les labels aient été créées.

vérifiez vos points de vente, je l'ai eu avant que les labels et les buttons peuvent simplement se déconnecté (si par exemple vous avez ajusté les contraintes ect)

une simple reconnection peut parfois résoudre le problème

J'ai eu exactement la même erreur et j'ai passé un certain time à le déboguer. Ce que @jmduke dit est vraiment la key: où se produit l'erreur?

Avec mon erreur particulière, en regardant operaterLabel.text == "" m'a conduit sur le bon path. J'ai accédé à operaterLabel.text alors que la vue n'était pas encore complètement initialisée. Dans mon cas particulier, j'ai défini une variable à partir d'une vue différente pendant une section, puis j'ai agi sur cette variable en cours de mise à jour et en mettant à jour une label dans la vue. Cependant, la vue n'a pas été complètement initialisée.

Ma solution consistait donc à mettre à jour l'label dans la fonction viewDidLoad() .

Cela signifie que votre storyboard n'a pas de lien vers votre IBOUTLET, veuillez vérifier

Si vous vous assurez que le xib pour votre cellule ne pose aucun problème,

Ensuite, j'ai ce problème, mon erreur a été save la méthode de cell :

1)

 self.tableView.register(TerantInfoTabCell.self, forCellReuseIdentifier: "TerantInfoTabCell") 

2)

 self.tableView.register(UINib(nibName:"TerantInfoTabCell", bundle: nil), forCellReuseIdentifier: "TerantInfoTabCell") 

J'utilise la première méthode, il va apparaître le problème, puis j'utilise la méthode 2) replace le 1), donc il n'y a pas de problème ici.

quelques fois le problème que vous avez initié voir le controller avant de le présenter comme ceci:

 let myViewController = MyViewController() 

replace cela par

 let myViewController = self.storyboard?.instantiateViewController(withIdentifier: "storyboardID") as! MyViewController 

J'ai eu cette erreur et mon problème a été causé en ajoutant un membre (appelons-le newProperty) à ma class de model, puis en essayant d'exécuter un projet qui a chargé des données avec NSCoder.decodeObjectForKey (newPropertyKey). Lors des tests précédents, j'avais enregistré des objects sans newProperty, donc quand l'application a essayé d'appeler decodeObjectForKey (newPropertyKey) sur mes anciennes données, Xcode a répondu avec ce message d'erreur.

Cette erreur se produit généralement parce que nous essayons de modifier le text UILabel après le chargement de la vue. Rappelez-vous que UILabels une fois chargé dans la vue ne peut pas être modifié d'une manière quelconque, ils ne peuvent être définis que dans la fonction viewdidload (). Vous pouvez vérifier cela en plaçant votre text assignant le code dans la fonction viewDidLoad () qui va définir UILabels lors du chargement de la vue, cela fonctionnera. Mais maintenant, si votre application est construite de telle sorte qu'elle définit UILabels après le chargement de la vue, la seule solution est que vous devrez créer UILabels dynamicment / Programatically où vous voulez dans le code et affecter ce que vous voulez parce que ils seront créés / instanciés avec ce text / label.