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

Posted

技术标签:

【中文标题】(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil【英文标题】:(Swift) PrepareForSegue: fatal error: unexpectedly found nil while unwrapping an Optional value 【发布时间】:2014-08-21 09:16:23 【问题描述】:

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 的文章,但我不知道我的问题的答案。

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

【问题讨论】:

你的插座连接了吗? 是的,它是(如第一篇文章中所述)减号是什么? Swift: PrepareForSegue, Swift Cast failure的可能重复 在调试器中输入 po vc.selectedBundesland "nil" 我需要知道如何给它一个值。在推送 segue 之前分配一个值(例如 selectedBundesland.text = "Test")时,它也不起作用 【参考方案1】:

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

【讨论】:

【参考方案2】:

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"

【讨论】:

通过 vc.textValue = "Test" 执行此操作时,我收到“致命错误:在展开可选值时意外发现 nil”。有什么想法吗?【参考方案3】:

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

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

然后使用if (segue.identifier == "BackToCalculator") 按您当前的方式分配值。一切都应该解决!

【讨论】:

【参考方案4】:

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

干杯

【讨论】:

【参考方案5】:

虽然正确的解决方案是存储文本并稍后在 viewDidLoad 或其他内容中将其附加到标签上,但对于测试建议,您可以通过强制 destinationViewController 通过调用其 @ 从情节提要构建自身来绕过该问题987654323@ 属性如:

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 打造

【讨论】:

以上是关于(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

prepareForSegue 不适用于自定义 segue (swift)

Swift:prepareForSegue 有两个不同的 segue

Swift:PrepareForSegue 正在运行但未加载 ViewController

在 Swift 2 中通过“prepareForSegue”传递数据

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

Swift:prepareForSegue 和 instantiateViewController 之间的区别