Попробуйте заменить эту строку кода
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)!
}
})
}
Обратите внимание на [weak self]
в закрытии observeSingleEvent()
, как и для любого асинхронного кода, который необходимо проверить, чтобы убедиться,правильные переменные все еще доступны.