我有两个视图控制器。第一个视图控制器获取用户的位置并具有委托方法。第二视图控制器符合第一VC的委托方法。我在第二个VC中有一个UILabel,显示从委托方法收到的位置。
@IBOutlet var locationLabel: UILabel!
func locationOfTheUser(location: String) {
locationLabel.text=location
}
locationLabel在IB中作为参考插座连接。 但是当我运行该程序时,它给出了一个错误,说明在打开可选项时意外发现了nil值。
答案 0 :(得分:0)
您应该声明您的标签:
@IBOutlet var weak locationLabel: UILabel!
提及" @ IBOutlet"使Interface Builder识别插座。
"弱"因为在大多数情况下,出口的所有者与视图的所有者不同。例如,视图控制器不拥有someLabel - 视图控制器的视图。
例如,如果有一个代码路径从其超级视图中删除了一个插座,或者该插座(故意)没有挂在故事板中,则需要是一个可选的,因为当插座无法保证在那里时它被访问了。
@IBOutlet var someLabel: UILabel?
如果没有代码路径将插座重新添加到视图层次结构中,那么当它被删除时,使其变弱并且不必要地保持它是不错的:
@IBOutlet weak var someLabel: UILabel?
这确保了如果从superview中删除标签,则视图控制器中的强引用不会将其保留在内存中。在最常见的情况下,如果有一个出口总是在那里,一个强大的,隐含的未包装的选项是合适的:
@IBOutlet var someLabel: UILabel!
如果代码发生变化,那么出口并不弱,因此有一个代码路径可以从视图层次结构中删除视图,但是您忘记更新属性的可选性。该对象将留在内存中并使用它不会使您的应用程序崩溃。
此外," var"是因为根据定义,出口是在初始化之后设置的
您可以在输入代码之后:
func locationOfTheUser(location: String) {
locationLabel.text=location
}
答案 1 :(得分:0)
private var locationOfUser: String?
func locationOfTheUser(location: String) {
locationOfUser = location
}
override func viewDidLoad() {
super.viewDidLoad()
locationLabel.text = locationOfUser
}
试试这个。如果它工作,则意味着在加载此控制器的视图之前调用locationOfTheUser(),因此标签尚未存在。
答案 2 :(得分:0)
@IBOutlet weak var heartbeats: UILabel!
guard heartbeats?.text != nil else {
print("The label is empty")
return
}
要检查uilabel是否真的为空。