我正在尝试运行此代码,但我一直收到此错误:
致命错误:在解包可选值时意外发现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")
}
}
答案 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)")
这解决了我的问题。