我花了几个小时尝试各种不同的组合,以便在Firebase异步下载后正确更新标题。这是here和here引发的同一问题。看起来像一个明确的解决方案,但我做错了什么,并希望任何帮助指向我正确的方向。
基本流程是查看加载,数据从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"
}
}
EDIT UPDATE:对上面代码的调用来自viewDidAppear()。如果我从viewDidLayoutSubviews()调用它,它也不会更新。
从调试中我知道标签更新正在调用,但没有任何变化。感觉就像我失踪的简单,但我被困住了。谢谢你的想法。
答案 0 :(得分:0)
我很确定你不需要DispatchQueue.main.async
位。只需尝试拨打self.loadDataFromView()
,看看是否有帮助。
答案 1 :(得分:0)
这最终成为错误标记导致混淆的一课。实际更改的标签实际上不是标签,而是按钮。不应该被命名为websiteLabel!用self.websiteLabel.setTitle("转到网站",for:.normal)更改标题后,一切都按预期工作。