Swift/iOS:UIPicker 显示在以编程方式更改数据源后点击后才会刷新

Posted

技术标签:

【中文标题】Swift/iOS:UIPicker 显示在以编程方式更改数据源后点击后才会刷新【英文标题】:Swift/iOS : UIPicker display is not refreshed until tapped after changing the datasource programmatically 【发布时间】:2017-07-20 17:06:29 【问题描述】:

在我的应用程序中,我有一个选择器,它在 POST 请求后填充了来自我的服务器的数据。

它最初只有一个元素(用作标签),当 POST 请求被填充时,数据源会发生变化,我调用 picker.reloadAllComponents() 来刷新它。

运行时,屏幕上似乎没有发生任何事情,选择器不会改变。但是一旦被点击,新数据就会立即出现并且可以正常工作。似乎数据源更改工作正常,但显示在刷新之前不会更改。

有没有办法刷新它,或者有不同的方法来改变数据源

以下是相关代码:

class MyController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource 

@IBOutlet weak var dossiers_picker: UIPickerView!
var pickerData: [Dossier] = [Dossier(nom: "Dossier", id: 0)]
// Dossier is just a tuple class with 2 attributes

override func viewDidLoad() 
    super.viewDidLoad()
    self.dossiers_picker.delegate = self
    self.dossiers_picker.dataSource = self
    getDossiers()


func numberOfComponents(in pickerView: UIPickerView) -> Int 
    return 1


func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
    return pickerData.count

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
    return pickerData[row].nom


func getDossiers() 
    ... // Cut the code where I call the server to get the data, etc ...
    let task = session.dataTask(with: request)  data, response, error in
        guard let data = data, error == nil else 
                // check for fundamental networking error
                print("error=\(String(describing: error))")
                return
            
        ... // get the data and turn it into an array of Dossier classes in var dossiers
        self.pickerData = dossiers
        dossiers_picker.reloadAllComponents()
    
    task.resume()


【问题讨论】:

所有 UI 更新必须在主队列上完成。 是的,在输入问题后才意识到这一点,感觉很愚蠢......谢谢 【参考方案1】:

在将异步标签添加到问题中时想出来了......很好的旧橡皮鸭调试。

正如@rmaddy 所说,所有 UI 更新都必须在主线程上完成。

在这种情况下,替换

dossiers_picker.reloadAllComponents()

DispatchQueue.main.async 
    self.dossiers_picker.reloadAllComponents()

【讨论】:

@Krunal 我看到您编辑了代码以添加“self.”,有区别吗?它在我的代码中没有自我,所以我很想知道是否最好添加它

以上是关于Swift/iOS:UIPicker 显示在以编程方式更改数据源后点击后才会刷新的主要内容,如果未能解决你的问题,请参考以下文章

Imageview 未显示在以编程方式创建的 collectionview 中

允许在以模式方式显示的以编程方式创建的视图内自动旋转

UIView(放置在滚动视图内)在以编程方式更改高度常量时不显示其子视图

PhoneGap iOS UIPicker 等效元素:以编程方式选择选项值

UIPicker 视图不显示来自 JSON 数组的数据

更改 UIPicker 突出显示的选项卡宽度