首页 文章

致命错误:在展开Optional值时意外发现nil

提问于
浏览
16

我试图运行此代码但我继续收到此错误:

致命错误:在展开Optional值时意外发现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")
}
}

9 回答

  • 1

    错误是指当可选值设置为nil时您正在访问可选值的参数(例如,当 answerField 为nil时访问 answerField.text ),可能是您的两个 UILabels 中的一个 .

    如果行 operaterLabel.text == "" 抛出异常,则 operaterLabel 为零 . 验证是否已将其成功连接到Interface Builder文件中的标签 .

  • 16

    在我的例子中,我试图访问我创建的函数中的标签,该函数在变量集之后使用 .

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

    我通过以下方式解决了

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

    我的理论是在创建视图和标签之前访问了我的函数updateUI .

  • 0

    检查你的插座,我已经有了这个标签和按钮可以刚刚连接(如果你已经调整了约束等)

    简单的重新连接有时可以解决问题

  • 5

    有时候你在出现之前启动视图控制器的问题是这样的:

    let myViewController  = MyViewController()
    

    替换它

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

    我有完全相同的错误,花了很多时间调试它 . @jmduke所说的真的是关键:错误发生在哪里?

    由于我的特殊错误,看着 operaterLabel.text == "" 让我走上了正确的道路 . 我在视图尚未完全初始化时访问了 operaterLabel.text . 在我的特定情况下,我在segue期间从不同的视图设置变量,然后对设置的变量进行操作并更新视图内的标签 . 但是该视图尚未完全初始化 .

    因此我的解决方案是更新 viewDidLoad() 函数内的标签 .

  • 3

    如果你确定你的手机的 xib 没问题,

    然后我发生这个问题,我的错误是注册 cell 方法:

    1)

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

    2)

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

    我使用第一种方法,会出现问题,然后我用2)方法替换1),所以这里没有问题 .

  • 2

    这意味着您的故事板没有指向您的IBOUTLET的链接,请验证

  • 0

    我有这个错误,我的问题是由一个成员(让我们称之为newProperty)添加到我的模型类,然后尝试运行一个使用NSCoder.decodeObjectForKey(newPropertyKey)加载数据的项目 . 在之前的测试中,我保存了没有newProperty的对象,所以当app试图在我的旧数据上调用decodeObjectForKey(newPropertyKey)时,Xcode会回复此错误消息 .

  • 2

    通常会发生此错误,因为我们尝试在加载视图后更改UILabel文本 . 请记住,在视图中加载的UILabel无法以任何方式更改它们只能在viewdidload()函数中设置 . 您可以通过将文本分配代码放在viewDidLoad()函数中来检查这一点,该函数将在加载视图时设置UILabel,它将起作用 . 但是现在如果您的应用程序是在加载视图后设置UILabels的方式构建的,那么唯一的解决方案是您需要动态地/编程地创建UILabels,无论您想在代码中使用什么,并分配您想要的任何内容,因为它们将使用该文本/标签创建/实例化 .

相关问题