【问题标题】:(Swift) PrepareForSegue: fatal error: unexpectedly found nil while unwrapping an Optional value(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil
【发布时间】: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 的文章,但我不知道我的问题的答案。

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

【问题讨论】:

  • 你的插座连接了吗?
  • 是的,它是(如第一篇文章中所述)减号是什么?
  • 在调试器中输入 po vc.selectedBundesland
  • "nil" 我需要知道如何给它一个值。在推送 segue 之前分配一个值(例如 selectedBundesland.text = "Test")时,它也不起作用

标签: ios swift label segue viewcontroller


【解决方案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 打造

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-30
          • 2015-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多