抱歉标题混乱,我不知道如何让它变得更有意义。
我正在使用此示例实现信息窗口: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是零。
但是你能解释一下我该如何设置它?如果没有任何其他标签,它为什么工作正常。
感谢。
答案 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功能的情况下,它不起作用。)