Не удается обновить пользовательский интерфейс в основном потоке с помощью didSet swift - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь обновить UILabel и UIImageView в основном потоке, но он не работает.

У меня есть два ViewController (я назову их ChooseCountryV C и DisplayCountryV C здесь) и в ChooseCountryV C, пользователь может выбрать страну, которая ему нравится, и в DisplayCountryV C Я хочу отобразить название страны в метке и флаг страны в imageView.

Основа c Ход процесса ниже.

  1. Нажать кнопку «Выбрать страну» в DisplayCountryV C
  2. Представить ChooseCountryV C, которая в основном представляет собой таблицу. Представление всех стран позволяет пользователю выбрать страну
  3. Когда пользователь выбирает страну, устанавливает свойство с именем "countryCode" в DisplayCountryV C и отклоняет ChooseCountryV C до go обратно к DisplayCountryV C
  4. В функции didSet для "countryCode" в DisplayCountryV C , добавьте процесс обновления пользовательского интерфейса в основной поток.

Ниже приведен пример кода, связанный с этим вопросом.

● ChooseCountryV C

* 10 20 *

● DisplayCountryV C

 var countryCode: String? {
    didSet {
        guard let countryCode = countryCode else {return}
        let countryName = self.getCountryName(with: countryCode) // this function provides countryName with no problem
        let flagImage = self.getFlag(with: countryCode) // this function provides flag image with no problem
        DispatchQueue.main.async {
            self.imageView.image = flagImage 
            self.label.text = countryName
            print("label's text is", self.label.text) // somehow, this prints out country's name correctly in console but apparently UI has not been updated at all
        }
    }
}

Если кто-нибудь знает, что не так с моими кодами или нужна дополнительная информация, пожалуйста, сообщите мне.

1 Ответ

2 голосов
/ 17 января 2020
 // when user has chosen a country and dismiss this VC
        let displayCountryVC = DisplayCountryVC()
        displayCountryVC.countryCode = self.chosenCountryCode
        self.dismiss(animated: true, completion: nil) // go back to DisplayCountryVC

Здесь вы можете инициировать новый контроллер представления и установить для него значение.

Ваш selectedCountryCode установлен на НОВЫЙ контроллер представления, а не на ваш первоначальный DisplayCountryV C.

После того, как ваш ChooseCountryV C отклонен, вы go возвращаетесь к исходному DisplayCountryV C. Этот новый DisplayCountryV C НЕ представлен и не используется.

Вам необходимо написать делегата или обратный вызов, чтобы передать выбранный код страны вашему исходному DisplayCountryV C.

...