私のアプリでは、POSTリクエスト後にサーバーからのデータでいっぱいのピッカーがあります。Swift/iOS:データソースをプログラムで変更した後、タップするまでUIPickerの表示がリフレッシュされない
最初に1つの要素(ラベルとして使用)があり、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()
}
}
で
を交換してください。 – rmaddy
うん、ちょうど質問を入力した後にこれを実現し、愚かな気分だった... ありがとう – Dino