UIView在prepareForSegue方法中是零

时间:2016-11-28 17:41:55

标签: ios swift class user-interface uiviewcontroller

抱歉标题混乱,我不知道如何让它变得更有意义。

我正在使用此示例实现信息窗口: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是零。

但是你能解释一下我该如何设置它?如果没有任何其他标签,它为什么工作正常。

感谢。

3 个答案:

答案 0 :(得分:2)

您将访问此

的第一种方法
info.adrLabel.text = branch.address
info.nameLabel.text = branch.name
info.telLabel.text = branch.tel

值为viewDidLoad()的{​​{1}}。

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

答案 1 :(得分:1)

由于您尝试在从prepareForSegue方法加载视图之前设置值,因此您将获得nil。相反,在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)
    }
   }

答案 2 :(得分:1)

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

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

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

(另外,在你的prepareForSegue功能的情况下,它不起作用。)