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

时间:2014-07-25 04:51:53

标签: ios swift

我正在尝试运行此代码,但我一直收到此错误:

  

致命错误:在解包可选值时意外发现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")
}
}

11 个答案:

答案 0 :(得分:16)

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

如果行operaterLabel.text == ""抛出异常,那么operaterLabel为零。确认您已成功将其连接到Interface Builder文件中的标签。

答案 1 :(得分:6)

就我而言,我试图访问我创建的函数中的标签,该函数在变量集之后使用。

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

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

我解决了它:

var something: String

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:3)

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

let myViewController  = MyViewController()

替换

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:2)

如果您确定单元格的xib没问题,

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

1)

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

2)

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

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

答案 6 :(得分:1)

我进行了搜索,试图找出解决类似问题的方法。正如其他人提到的那样,我在初始化UI元素之前就已对其进行访问。但是找出原因是困难的部分。剧透->我正在使用ProfileVC.swift和profileVC.xib

即使我所有的连接都在IB中,但我从调用的parentVC中访问

let newVC = ProfileVC()
profile.modalPresentationStyle = .custom
present(profile, animated: true, completion:nil)

由于我使用了不同的名称(在我的swift文件中使用大写字母“ P”,在xib中使用小写字母“ p”),因此调用ProfileVC()不起作用,因为它不知道要转到我制作的xib。相反,我必须使用:

let newVC = ProfileVC.init(nibName: "profileVC", bundle: Bundle.main)

或者只是将xib重命名为大写字母P,我可以使用原始代码

显然,这在stackoverflow中很难看到,因为您需要查看在父VC中调用的内容,文件名和IB。因此,希望这可能是解决某人问题的一种方法,即使它不能解决Arshia的问题。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

正如@aircraft所说,您可以通过以下方式注册您的手机:

let cellNib = UINib(nibName: "\(CellClass.self)", bundle: nil)
tableView.register(cellNib, forCellReuseIdentifier: "\(CellClass.self)")

这解决了我的问题。