使用函数以编程方式更新 UILabel 文本
Updating UILabel text programmatically using a function
所以我正在尝试使用函数更新 UIlabel 文本。我很少看到像我这样的其他问题,我尝试了他们的方法,但它不起作用。 fun returns 在 UIlabel 中使用时没有值。我已经展示了我的代码 below.It 必须注意的是,当我在 viewdidload 中使用该函数时,我可以检索数据。
lazy var name: UILabel = {
let lb = UILabel()
lb.text? = getthename()
lb.lineBreakMode = NSLineBreakMode.byWordWrapping
lb.textColor = .mainGreen
lb.textAlignment = .left
lb.font = UIFont.boldSystemFont(ofSize:12.0)
return lb
}()
func getthename() -> String {
var wins : String = ""
let ud = (Auth.auth().currentUser?.uid)
self.ref = Database.database().reference()
self.ref.child("Users").child(ud!).observeSingleEvent(of: .value, with: {(snapshot) in
if let getData = snapshot.value as? [String:Any] {
wins = (getData["lastName "] as? String)!
}
})
return wins
}
尝试替换这行代码
lb.text? = getthename()
与lb.text = getthename()
您目前正在使用“?”进行可选的解包。符号,它导致该行基本上等于 nil = getthename()
此外,正如@Larme 所提到的,以下代码实际上是异步的:
self.ref.child("Users").child(ud!).observeSingleEvent(of: .value, with: {(snapshot) in
if let getData = snapshot.value as? [String:Any] {
wins = (getData["lastName "] as? String)!
}
})
与其尝试在惰性变量初始值设定项中设置标签的文本,我建议您将其设置在别处。您可以更新 getthename()
函数以在对 observeSingleEvent()
的调用返回后使用对标签的引用来更新标签的文本。
所以像这样
lazy var name: UILabel = {
let lb = UILabel()
lb.lineBreakMode = NSLineBreakMode.byWordWrapping
lb.textColor = .mainGreen
lb.textAlignment = .left
lb.font = UIFont.boldSystemFont(ofSize:12.0)
return lb
}()
那么getthename()
函数可以改成下面这样。您可以从任何地方调用该函数,它会为您设置标签。
func getthename() {
var wins : String = ""
let ud = (Auth.auth().currentUser?.uid)
self.ref = Database.database().reference()
self.ref.child("Users").child(ud!).observeSingleEvent(of: .value, with: { [weak self] (snapshot) in
if let getData = snapshot.value as? [String:Any] {
self?.name.text = (getData["lastName "] as? String)!
}
})
}
请注意 observeSingleEvent()
闭包中的 [weak self]
与您需要检查的任何异步代码一样,以确保正确的变量是否仍然可用。
所以我正在尝试使用函数更新 UIlabel 文本。我很少看到像我这样的其他问题,我尝试了他们的方法,但它不起作用。 fun returns 在 UIlabel 中使用时没有值。我已经展示了我的代码 below.It 必须注意的是,当我在 viewdidload 中使用该函数时,我可以检索数据。
lazy var name: UILabel = {
let lb = UILabel()
lb.text? = getthename()
lb.lineBreakMode = NSLineBreakMode.byWordWrapping
lb.textColor = .mainGreen
lb.textAlignment = .left
lb.font = UIFont.boldSystemFont(ofSize:12.0)
return lb
}()
func getthename() -> String {
var wins : String = ""
let ud = (Auth.auth().currentUser?.uid)
self.ref = Database.database().reference()
self.ref.child("Users").child(ud!).observeSingleEvent(of: .value, with: {(snapshot) in
if let getData = snapshot.value as? [String:Any] {
wins = (getData["lastName "] as? String)!
}
})
return wins
}
尝试替换这行代码
lb.text? = getthename()
与lb.text = getthename()
您目前正在使用“?”进行可选的解包。符号,它导致该行基本上等于 nil = getthename()
此外,正如@Larme 所提到的,以下代码实际上是异步的:
self.ref.child("Users").child(ud!).observeSingleEvent(of: .value, with: {(snapshot) in
if let getData = snapshot.value as? [String:Any] {
wins = (getData["lastName "] as? String)!
}
})
与其尝试在惰性变量初始值设定项中设置标签的文本,我建议您将其设置在别处。您可以更新 getthename()
函数以在对 observeSingleEvent()
的调用返回后使用对标签的引用来更新标签的文本。
所以像这样
lazy var name: UILabel = {
let lb = UILabel()
lb.lineBreakMode = NSLineBreakMode.byWordWrapping
lb.textColor = .mainGreen
lb.textAlignment = .left
lb.font = UIFont.boldSystemFont(ofSize:12.0)
return lb
}()
那么getthename()
函数可以改成下面这样。您可以从任何地方调用该函数,它会为您设置标签。
func getthename() {
var wins : String = ""
let ud = (Auth.auth().currentUser?.uid)
self.ref = Database.database().reference()
self.ref.child("Users").child(ud!).observeSingleEvent(of: .value, with: { [weak self] (snapshot) in
if let getData = snapshot.value as? [String:Any] {
self?.name.text = (getData["lastName "] as? String)!
}
})
}
请注意 observeSingleEvent()
闭包中的 [weak self]
与您需要检查的任何异步代码一样,以确保正确的变量是否仍然可用。