UILabel.text
在主线程中未更新。 labelOne
已更新,但表示已翻译单词的labelTwo
未更新。当我打印translatedWord
时,它将向控制台打印正确的字符串,但是UILabel
未更新。
datatask = session.dataTask(with: request, completionHandler: {data, response, error in
if error == nil {
let receivedData = try? JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any]
DispatchQueue.main.async {
self.labelOne.text = wordTobeTranslated
let data = "\(String(describing: receivedData!["text"]))"
let all = data.components(separatedBy: "(")
let afterAll = all[2]
let last = afterAll.components(separatedBy:")" )
self.translatedWord = last[0]
self.importantWords.append(last[0])
self.labelTwo.text = self.translatedWord
print(self.translatedWord)
}
}
})
datatask?.resume()
答案 0 :(得分:0)
一些调试问题的提示:
如果通过上述任何步骤显示了字符串,则在故事板中正确配置了labelTwo。
您也可以在更新文本后强制使用self.labelTwo.layoutIfNeeded()
方法来强制更新UI。
如果所有步骤都不能帮助您,请检查UILabel的字体颜色。如果与背景色相同,则看不到。
答案 1 :(得分:0)
查看您的代码示例,您似乎正在尝试检索:
describing: receivedData!["text"]
来自:
\(String(describing: receivedData!["text"]))
问题是\(...)
文字中的String
导致string interpolation,其中\(
和)
内的表达式将被求值,这将是放在字符串中。 String(describing: ...)
将解释该值并返回一个字符串表示形式。因此,假设receivedData!["text"]
包含“ Foo”一词。然后
let data = "\(String(describing: receivedData!["text"]))"
将导致data
包含字符串Optional("Foo")
。
如果要删除该Optional(...)
部分,则应该解开可选部分,或使用nil
-coalescing运算符??
。坦率地说,我只需要做:
let data = String(describing: receivedData?["text"] ?? "")
答案 2 :(得分:0)
我知道这是一个老问题,但对于新搜索者:尝试将UILabel的行数设置为零。这可能是一个约束问题。