Текст UILabel не обновляется даже в MainThread - PullRequest
0 голосов
/ 05 мая 2019

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

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Глядя на ваш пример кода, кажется, что вы пытаетесь получить:

describing: receivedData!["text"]

от

\(String(describing: receivedData!["text"]))

Проблема в том, что \(...) в литерале String приводит к интерполяции строки , где будет вычисляться выражение внутри \( и ), и это будет то, что будет находиться в строке , И String(describing: ...) будет интерпретировать значение и вернет строковое представление. Итак, допустим, что receivedData!["text"] содержит слово «Foo». Тогда

let data = "\(String(describing: receivedData!["text"]))"

В результате data будет содержать строку, Optional("Foo").

Если вы хотите удалить эту Optional(...) деталь, вы должны либо развернуть дополнительную, либо использовать оператор nil коалесцирования, ??. И, честно говоря, вместо использования строковой интерполяции я бы просто сделал:

let data = String(describing: receivedData?["text"] ?? "")
0 голосов
/ 05 мая 2019

Несколько советов по устранению проблемы:

  1. Попробуйте установить жестко закодированную строку для labelTwo и проверьте, отображается. (Или)
  2. Обновите любое значение labelTwo в раскадровке и проверьте, является ли оно отображение.

Если строка отображается на любом из вышеперечисленных шагов, то labelTwo правильно настроен в раскадровке.

Вы также можете попробовать self.labelTwo.layoutIfNeeded() метод после обновления текста, чтобы принудительно обновить пользовательский интерфейс.

Если вам не помог ни один из шагов, проверьте цвет шрифта UILabel. Если он совпадает с цветом фона, он не будет виден.

...