UILabel文本即使在MainThread中也不会更新

时间:2019-05-05 10:07:31

标签: ios swift uilabel dispatch-async

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()

3 个答案:

答案 0 :(得分:0)

一些调试问题的提示:

  1. 尝试将一些硬编码的字符串设置为labelTwo并检查是否 正在显示。 (或)
  2. 在情节提要中更新labelTwo的任何值,并检查是否为 显示。

如果通过上述任何步骤显示了字符串,则在故事板中正确配置了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的行数设置为零。这可能是一个约束问题。

相关问题