【问题标题】:prepare segue unexpectedly found nil while unwrapping an Optional value在展开可选值时准备 segue 意外发现 nil
【发布时间】:2016-10-17 22:24:02
【问题描述】:

是的,另一个在展开可选值错误时发现 nil。我已经阅读了大量具有类似错误的其他堆栈溢出帖子,例如 this 一个和许多其他帖子。我仍然不完全理解如何正确处理解包变量。

我有一个类似于以下的类:

@IBOutlet weak var nameTextField: UITextField?
@IBOutlet weak var valueInput: UITextField?

var checkbox : CheckBox?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let name = nameTextField.text ?? ""
    let state = buttonState.getIsChecked()
    let value : Int? = Int(valueInput.text!)
    let isMoveable = true

    checkbox = CheckBox(name: name, value: value, state: state, isMoveable: isMoveable)
}

我在“let value : Int? = Int(valueInput.text!) 行。

【问题讨论】:

标签: ios swift optional


【解决方案1】:

您可以使用if let 构造安全地解开该值

var value : Int? = nil 

if let val = valueInput.text {
  value = Int(val) // it would either nil or optional value
}

你也可以通过nil coalescing operator??在一行中完成

let value : Int? = Int(valueInput.text ?? "")

更新

首先检查文本字段是否与 Interface Builder 断开连接,如果没有连接,请连接它们。如果您成为您的文本字段选项,您还必须安全地打开文本字段(您忘记从界面生成器添加它,如果您将它们设为选项,它不会崩溃)。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

var name: String? = nil
var value : Int? = nil
let state = buttonState.getIsChecked()
let isMoveable = true


if let nameTextField = self.nameTextField where nameTextField.text != nil {
  name = nameTextField.text!
}

if let valueTextField = self.valueInput where valueTextField.text != nil {
  value = Int(valueTextField.text!)
}

 checkbox = CheckBox(name: name, value: value, state: state, isMoveable: isMoveable)

}

【讨论】:

  • 非常感谢您的帮助!不过,我仍然收到错误
  • 对于 if let,错误发生在 'if let val = valueInput.text' 行。它也发生在 nil 合并运算符行上
  • 看我的回答,valueInput 是 nil 的可选项,不是 valueInput.text
  • 好的。似乎您的文本字段与 Interface Builder 断开连接(连接它们),并且您的 nameTextField 和 valueInput 是可选的。您还必须首先进行可选绑定。我会更新答案
【解决方案2】:

Sahil 的回答是正确的,但没有提到 valueInput 也是可选的。使用此代码:

if let valueInput = valueInput,
    let val = valueInput.text {
    value = Int(val)
}

除了关于正确解开可选的valueInput 之外,我想补充一点,如果valueInputIBOutlet,它被定义为:

@IBOutlet weak var valueInput: UITextField!

这称为隐式展开的可选项。烦人的是,由于它也是IBOutlet,如果它与Interface Builder 中的UITextField 断开连接,该变量将变为nil,并且从代码中的任何位置访问它都会导致崩溃。

改成这样:

@IBOutlet weak var valueInput: UITextField?

我也在我的博客上写过这个:http://cleanswifter.com/implicitly-unwrapped-iboutlets/

注意:您没有显示valueInput 的定义,所以我认为它是UITextField

【讨论】:

  • 是的,这是问题的一部分!我将在我的问题中编辑代码
  • 好的,问题解决了吗?
  • 是的!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2016-10-18
  • 2017-04-09
  • 2018-09-22
  • 2016-06-26
  • 2016-03-12
相关资源
最近更新 更多