【问题标题】:UIView is nil in prepareForSegue methodUIView 在 prepareForSegue 方法中为零
【发布时间】:2023-04-04 14:56:01
【问题描述】:

抱歉标题混淆了,我不知道如何使它更有意义。

我正在使用这个例子实现信息窗口:github

我在 popView 中添加了一些标签并将它们链接到 secondaryVieController。

我已将 PrimaryViewController 中的 prepareForSegue 方法修改为:

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

        if segue.identifier == "showInfo" {

            let info = segue.destinationViewController as! SecondaryViewController
           info.adrLabel.text = branch.address
            info.nameLabel.text = branch.name
            info.telLabel.text = branch.tel

          dim(.In, alpha: dimLevel, speed: dimSpeed)
   }
}

但是当我运行它时,我收到错误“致命错误:在展开可选值时意外发现 nil”

这是因为 info.popupView 为 nil。

但是你能解释一下我应该如何设置它吗?以及如果没有任何附加标签,为什么它可以正常工作。

谢谢。

【问题讨论】:

    标签: ios swift class user-interface uiviewcontroller


    【解决方案1】:

    您将访问此的第一种方法

    info.adrLabel.text = branch.address
    info.nameLabel.text = branch.name
    info.telLabel.text = branch.tel
    

    值将是 viewDidLoad()SecondaryViewController

    您需要创建变量并在这些变量中分配值,并且在 viewDidLoad() 中您可以使用这些变量将值分配给您的标签。

    【讨论】:

    • 是的,它确实有效!两分钟内就能接受。但为什么会这样? uiview 尚未加载,这就是为什么我不能在视图内分配标签的原因?或视图?再次感谢
    • 您的视图未在 prepareForSegue 方法中初始化,每个 UIViewController 视图都将在 viewDidLoad 中初始化,并且每当您对变量使用可选绑定并将该变量设为 nil 时,您的应用程序将获得崩溃了。
    【解决方案2】:

    您得到 nil 是因为您试图在视图从您的 prepareForSegue 方法加载之前设置值。相反,在 SecondaryViewController 中设置一些变量来保存值并在 viewDidLoad 中设置标签:

        class SecondaryViewController {
            var address: String?
            var name: String?
            var tel: String?
    
            override func viewDidLoad() {
            adrLabel.text = address
            nameLabel.text = name
            telLabel.text = tel
            }
        }
    

    现在您在 prepareForSegue 中需要做的就是:

        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
        if segue.identifier == "showInfo" {
    
            let info = segue.destinationViewController as! SecondaryViewController
           info.address = branch.address
            info.name = branch.name
            info.tel = branch.tel
    
          dim(.In, alpha: dimLevel, speed: dimSpeed)
        }
       }
    

    【讨论】:

    • 谢谢!我也对你的答案投了赞成票,但我们同事的答案是第一位的 :)
    • 很高兴我能帮上忙
    【解决方案3】:

    作为一般规则,您不应尝试直接操作另一个视图控制器的视图。这违反了封装原则。您应该将它们视为私有的。

    相反,将属性添加到目标视图控制器并设置这些属性。然后在目标视图控制器的 viewWillAppear 方法中,将这些属性中的值安装到适当的视图中。

    这样,如果您以后更改视图控制器的视图,您只需在一个地方(视图控制器)更改代码

    (另外,在您的 prepareForSegue 函数等情况下,它不起作用。)

    【讨论】:

    • 感谢 Duncan 的精彩解释!我投票赞成你的答案
    猜你喜欢
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多