UILabel提供零值

时间:2017-01-31 10:12:41

标签: swift uilabel optional

我有两个视图控制器。第一个视图控制器获取用户的位置并具有委托方法。第二视图控制器符合第一VC的委托方法。我在第二个VC中有一个UILabel,显示从委托方法收到的位置。

@IBOutlet var locationLabel: UILabel!
func locationOfTheUser(location: String) {
locationLabel.text=location
}

locationLabel在IB中作为参考插座连接。 但是当我运行该程序时,它给出了一个错误,说明在打开可选项时意外发现了nil值。

3 个答案:

答案 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是否真的为空。