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

时间:2014-08-21 09:16:23

标签: ios swift tableview segue iboutlet

DetailViewController:

    @IBOutlet var selectedBundesland: UILabel!

TableViewController:

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {


    if (segue.identifier == "BackToCalculator") {
        var vc:FirstViewController = segue.destinationViewController as FirstViewController
            vc.selectedBundesland.text = "Test"
    }

IBOutlet已连接!

错误:致命错误:在解包可选值时意外发现nil

我读了很多关于Optionals的页面,但我不知道我的问题的答案。

您是否需要有关我的项目的更多信息?

5 个答案:

答案 0 :(得分:28)

您无法直接写入UILabel中的prepareForSegue,因为视图控制器尚未完全初始化。您需要创建另一个字符串属性来保存该值并将其放入相应函数的标签中 - 例如viewWillAppear

答案 1 :(得分:12)

DetailViewController:

var textValue: String = ""
@IBOutlet weak var selectedBundesland: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    selectedBundesland.text = textValue
}

TableViewController:

     if (segue.identifier == "BackToCalculator") {  
         var vc:FirstViewController = segue.destinationViewController as FirstViewController
         vc.textValue = "Test"
}

答案 2 :(得分:4)

最近有这个问题。问题是我将segue从特定对象从当前视图控制器拖到目标视图控制器 - 如果要传递值,请不要这样做。

而是将其从窗口顶部的黄色块拖到目标视图控制器。然后恰当地命名segue。

然后使用if (segue.identifier == "BackToCalculator")分配您当前的值。一切都应该成功!

答案 3 :(得分:1)

我遇到了同样的问题,我通过定义一个没有连接到新视图控制器中的插座的字符串来解决它,而不是在prepareForSegue()方法中引用它,在新的VC中我做了标签出口在viewDidLoad()方法中获取非连接字符串的值。

干杯

答案 4 :(得分:0)

虽然正确的解决方案是存储文本并在viewDidLoad之后将其附加到标签上,但是为了进行测试建议,您可以通过强制destinationViewController从故事板构建自己来绕过问题通过调用其view属性,如:

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

     if (segue.identifier == "TestViewController") {
          var vc:FirstViewController = segue.destination as! TestViewController
          print(vc.view)
          vc.testLabel.text = "Hello World!"
     }
}

Swift 3.0 做爱