【问题标题】:iOS label does not update text even from main threadiOS标签即使从主线程也不会更新文本
【发布时间】:2017-03-25 06:34:00
【问题描述】:

我花了几个小时尝试各种不同的组合,以使标签在 Firebase 异步下载后正确更新其标题。这与herehere 提出的问题相同。似乎是一个明确的解决方法,但我做错了什么,如果有任何帮助指出我正确的方向,我将不胜感激。

基本流程是视图加载,从 Firebase 下载数据,一些标签会根据下载的数据进行相应更新。我尝试过的一个有代表性的迭代如下:

        // Query Firebase.
        let detailsRef = self.ref.child("eventDetails")
        detailsRef.queryOrdered(byChild: "UNIQUE_ID_EVENT_NUMBER").queryEqual(toValue: eventID).observeSingleEvent(of: .value, with: { snapshot in

            if (snapshot.value is NSNull) {
                print("error")
            }
            else {

                var tempDict = [NSDictionary]()

                for child in snapshot.children {

                    let data = child as! FIRDataSnapshot
                    let dict = data.value as! NSDictionary as! [String:Any]
                    tempDict.append(dict as NSDictionary)
                }

                self.dictionaryOfRecoDetails = tempDict
                self.ParseFirebaseData()

                DispatchQueue.main.async {
                    // This is the function that updates labels and button text in format like self.websiteLabel.titleLabel?.text = "Appropriate String"
                    self.loadDataForView()
                }
            }
        })


func loadDataForView() {

    // Example of the label update that happens within this function.
    // Do not show website button if there is no website.
    if self.recommendation.recommendationWebsiteUrl == "" || self.recommendation.recommendationWebsiteUrl == nil || self.recommendation.recommendationWebsiteUrl == "NA" {

        self.websiteLabel.titleLabel?.text = ""
        self.websiteHeight.constant = 0
        self.websiteBottom.constant = 0
    }
    else {
        self.websiteLabel.titleLabel?.text = "Go to Website"
    }
}

编辑更新:对上面代码的调用来自 viewDidAppear()。如果我从 viewDidLayoutSubviews() 调用它也不会更新。

通过调试,我知道标签更新被调用,但没有任何变化。感觉就像我错过了一些简单的东西,但我被卡住了。谢谢你的想法。

【问题讨论】:

  • 你应该直接在DispatchQueue.main.async中调用更新标签,不要在DispatchQueue.main.async中调用self.loadDataForView()。
  • @nynohu 应该是一样的,但值得一试,看看它是否修复,我没有在这段代码中看到问题
  • 你试过了吗?我遇到了和你一样的问题,我通过在主线程中直接调用 update view 来修复它。
  • 我调用函数更新标签还是直接在 DispatchQueue.main.async 中更新都没有区别。
  • loadDataForView 被调用了多少次?可能是它在包含的if 传递的地方被调用一次,因此它将宽度和高度设置为零。然后第二次其实是设置文字,但是自动布局约束还是零?

标签: ios swift asynchronous firebase uilabel


【解决方案1】:

我很确定您不需要DispatchQueue.main.async 位。只需尝试致电self.loadDataFromView() 看看是否有帮助。

【讨论】:

    【解决方案2】:

    这最终成为错误标签导致混乱的教训。被改变的标签实际上不是一个标签,而是一个按钮。不应该被命名为 websiteLabel!使用 self.websiteLabel.setTitle("Go to Website", for: .normal) 更改标题后,一切都会按预期进行。

    【讨论】:

      猜你喜欢
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      相关资源
      最近更新 更多