2017-07-20 9 views
0

私のアプリでは、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() 
} 
} 
+1

dossiers_picker.reloadAllComponents() 

を交換してください。 – rmaddy

+0

うん、ちょうど質問を入力した後にこれを実現し、愚かな気分だった... ありがとう – Dino

答えて

0

はそれを考え出しました...良い古いゴム製の鴨のデバッグ。

@rmaddyによると、すべてのUIの更新はメインスレッドで行う必要があります。この場合

、すべてのUIの更新がメインキューに行われなければならない

DispatchQueue.main.async { 
    self.dossiers_picker.reloadAllComponents() 
} 
+0

@Krunal私は "自己"を追加するコードを編集して参照してください、違いはありますか?それは私のコードで自己なしで動作するので、私はそれを追加するほうがいいかどうかを知りたい – Dino

関連する問題