我试图运行此代码但我继续收到此错误:
致命错误:在展开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 回答
错误是指当可选值设置为nil时您正在访问可选值的参数(例如,当
answerField
为nil时访问answerField.text
),可能是您的两个UILabels
中的一个 .如果行
operaterLabel.text == ""
抛出异常,则operaterLabel
为零 . 验证是否已将其成功连接到Interface Builder文件中的标签 .在我的例子中,我试图访问我创建的函数中的标签,该函数在变量集之后使用 .
我通过以下方式解决了
我的理论是在创建视图和标签之前访问了我的函数updateUI .
检查你的插座,我已经有了这个标签和按钮可以刚刚连接(如果你已经调整了约束等)
简单的重新连接有时可以解决问题
有时候你在出现之前启动视图控制器的问题是这样的:
替换它
我有完全相同的错误,花了很多时间调试它 . @jmduke所说的真的是关键:错误发生在哪里?
由于我的特殊错误,看着
operaterLabel.text == ""
让我走上了正确的道路 . 我在视图尚未完全初始化时访问了operaterLabel.text
. 在我的特定情况下,我在segue期间从不同的视图设置变量,然后对设置的变量进行操作并更新视图内的标签 . 但是该视图尚未完全初始化 .因此我的解决方案是更新
viewDidLoad()
函数内的标签 .如果你确定你的手机的
xib
没问题,然后我发生这个问题,我的错误是注册
cell
方法:1)
2)
我使用第一种方法,会出现问题,然后我用2)方法替换1),所以这里没有问题 .
这意味着您的故事板没有指向您的IBOUTLET的链接,请验证
我有这个错误,我的问题是由一个成员(让我们称之为newProperty)添加到我的模型类,然后尝试运行一个使用NSCoder.decodeObjectForKey(newPropertyKey)加载数据的项目 . 在之前的测试中,我保存了没有newProperty的对象,所以当app试图在我的旧数据上调用decodeObjectForKey(newPropertyKey)时,Xcode会回复此错误消息 .
通常会发生此错误,因为我们尝试在加载视图后更改UILabel文本 . 请记住,在视图中加载的UILabel无法以任何方式更改它们只能在viewdidload()函数中设置 . 您可以通过将文本分配代码放在viewDidLoad()函数中来检查这一点,该函数将在加载视图时设置UILabel,它将起作用 . 但是现在如果您的应用程序是在加载视图后设置UILabels的方式构建的,那么唯一的解决方案是您需要动态地/编程地创建UILabels,无论您想在代码中使用什么,并分配您想要的任何内容,因为它们将使用该文本/标签创建/实例化 .