Обновление текста UILabel программно с помощью функции - PullRequest
0 голосов
/ 20 января 2019

, поэтому я пытаюсь обновить текст UIlabel с помощью функции. Я видел несколько других вопросов, таких как мой, и я попробовал их метод, но он не работает. fun не возвращает значения при использовании в UIlabel. Я показал мой код ниже. Следует отметить, что когда я использую функцию в 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
}

1 Ответ

0 голосов
/ 20 января 2019

Попробуйте заменить эту строку кода

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(), как и для любого асинхронного кода, который необходимо проверить, чтобы убедиться,правильные переменные все еще доступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...