无法使用didSet swift更新主线程中的UI

问题描述 投票:0回答:1

我正在尝试在主线程中更新UILabel和UIImageView,但无法正常工作。

我有两个ViewController(在这里我将它们称为ChooseCountryVC和DisplayCountryVC),在ChooseCountryVC中,用户可以选择他们喜欢的国家,在DisplayCountryVC中,我想在imageView的标签和国家/地区的标志中显示国家/地区的名称。

基本处理流程如下。

  1. 在DisplayCountryVC中点击“选择国家/地区”按钮
  2. 目前存在ChooseCountryVC,基本上是所有国家/地区的表格视图,用户可以选择一个国家/地区
  3. 当用户选择一个国家时,在DisplayCountryVC中设置名为“ countryCode”的属性,并关闭ChooseCountryVC以返回到DisplayCountryVC
  4. 在DisplayCountryVC的“ countryCode”上的didSet函数中,将UI更新过程添加到主线程。

与此相关的代码示例如下。

●ChooseCountryVC

       // 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

●DisplayCountryVC

 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
        }
    }
}

如果有人知道我的代码有什么问题或需要更多信息,请告诉我。

swift user-interface grand-central-dispatch
1个回答
0
投票
 // 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设置为NEW视图控制器,而不是原始的DisplayCountryVC。

关闭ChooseCountryVC后,您返回到原始的DisplayCountryVC。没有显示或使用此新的DisplayCountryVC。

您需要编写委托或回调,以将所选的国家/地区代码传递到原始DisplayCountryVC。

© www.soinside.com 2019 - 2024. All rights reserved.