Фатальная ошибка: неожиданно найден nil при развертывании необязательного значения

Я пытаюсь запустить этот код, но я продолжаю получать эту ошибку:

фатальная ошибка: неожиданно найден nil при развертывании необязательного значения

Я не понимаю, что это значит или почему я его получаю. Любой намек?

import UIKit

class ViewController: UIViewController {

var lastNumber: String = ""
@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")
}
}

Ответ 1

ошибка относится к тому факту, что вы получаете доступ к параметру необязательного значения, когда необязательное значение установлено на nil (например, доступ к answerField.text, когда answerField равен нулю), вероятно, один из двух UILabels,

Если строка operaterLabel.text == "" выбрасывает исключение, то ваш operaterLabel равен нулю. Убедитесь, что вы успешно подключили его к ярлыку в файле Interface Builder.

Ответ 2

В моем случае я пытался получить доступ к меткам в созданной мной функции, которая была использована после набора переменной.

var something: String {
    didSet {
        updateUI()
    }
}

func updateUI() {
    label.text = "Hello"
}

Я решил это:

var something: String

override func viewDidLoad() {
    label.text = "hello"
}

Моя теория заключается в том, что моя функция updateUI была доступна до того, как были созданы представления и метки.

Ответ 3

проверьте свои выходы, у меня было это до того, как метки и кнопки могут просто перестать подключаться (если, например, вы скорректировали ограничения и т.д.)

простое соединение re иногда может исправить проблему

Ответ 4

У меня была такая же ошибка, и я потратил немало времени на ее отладку. То, что сказал @jmduke, действительно является ключевым: где происходит ошибка?

С моей конкретной ошибкой, глядя на operaterLabel.text == "", я повел меня по правильному пути. Я получил доступ к operaterLabel.text, пока представление еще не было полностью инициализировано. В моем конкретном случае я устанавливал переменную из другого представления во время segue, а затем выполнял настройку этой переменной и обновлял метку внутри представления. Однако представление не было полностью инициализировано.

Таким образом, я решил обновить метку внутри функции viewDidLoad().

Ответ 5

Это означает, что у вашей раскадровки нет ссылки на ваш IBOUTLET, пожалуйста, проверьте

Ответ 6

Если вы уверены, что xib для вашей ячейки не проблема,

Затем я сталкиваюсь с этой проблемой, моя ошибка регистрирует метод cell:

1)

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

2)

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

Я использую первый метод, появится проблема, затем я использую метод 2) заменить 1), поэтому здесь нет проблем.

Ответ 7

несколько раз проблема, с которой вы инициировали контроллер представлений, перед тем, как это сделать:

let myViewController  = MyViewController()

замените это на

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

Ответ 8

У меня была эта ошибка, и моя проблема была вызвана добавлением члена (позвоните его newProperty) в мой класс модели, а затем попытался запустить проект, который загружал данные с помощью NSCoder.decodeObjectForKey(newPropertyKey). Во время предыдущего тестирования я сохранил объекты без newProperty, поэтому, когда приложение попыталось вызвать decodeObjectForKey (newPropertyKey) на мои старые данные, Xcode ответил на это сообщение об ошибке.

Ответ 9

Эта ошибка обычно возникает, потому что мы пытаемся изменить текст UILabel после загрузки представления. Помните, что UILabels, однажды загруженные в представление, не могут быть изменены каким-либо образом, они могут быть установлены только в функции viewdidload(). Вы можете проверить это, поместив свой текст, назначая код в функции viewDidLoad(), которая установит UILabels при загрузке представления, оно будет работать. Но теперь, если ваше приложение построено таким образом, что он устанавливает UILabels после загрузки представления, единственным решением является то, что вам нужно будет создавать UILabels динамически/программно, где бы вы ни захотели в коде, и назначить то, что вы хотите, они будут созданы/созданы с помощью этого текста/метки.