使用函数以编程方式更新UILabel文本

时间:2019-01-20 15:22:22

标签: swift uilabel

所以我正在尝试使用func更新UIlabel文本。我没有看到其他问题,例如我的问题,我尝试了他们的方法,但是没有用。在UIlabel中使用fun时不返回任何值。我在下面显示了我的代码,需要注意的是,当我在viewdidload中使用该函数时,我可以检索数据。

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    filename := "/proc/sys/net/core/somaxconn"
    f, err := os.Open(filename)
    data := make([]byte, 100)
    _, err2 := f.Read(data)
    if err != nil || err2 != nil {
        log.Println(err2)
        log.Fatal(err)
    }
    fmt.Printf("SOMAXCONN: %v", string(data))
    log.Fatal(http.ListenAndServe(":8888", nil))
}

1 个答案:

答案 0 :(得分:0)

尝试替换此行代码

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()以及您需要检查以确保正确的变量是否仍然可用的任何异步代码。