2017-07-19 9 views
0

UIPickerの初期値の設定に問題があります。 私は: 私のストーリーボードのUIPicker。 TableViewControllerに接続されている(私は静的なテーブルを持っている)IBOutletとしてクラス:UIPickerのselectedRowの設定に関する問題

enter image description here

class SettingsTableViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource { 
    //Variables 
    let pricePerHour: Float = 0 
    let defaults = UserDefaults.standard 
    let currencies = ["USD", "RUR", "UAH", "BYN", "NIS"] 

    //IBOutlets 
    @IBOutlet weak var isTimeCafeSwitch: UISwitch! 
    @IBOutlet weak var pricePerHourTextField: UITextField! 
    @IBOutlet var currencyPicker: UIPickerView! 

Iは、初期値を設定するための例としてthis回答を使用しました。 しかし、完全に初期化される前にUIピッカーの値を設定しようとしているので、NSRangeExceptionが発生しています。私は、問題を示すために私のコードにいくつかのプリントを追加しました:ここ

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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    print("Picker view initialized - getting number of rows") 
    return currencies.count 
} 

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return currencies[row] 
} 

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    defaults.set(currencies[row], forKey: "currency") 
    print(GenericStuff.currency) 
} 


//System functions for view 
override func viewDidLoad() { 
    print("View did load") 
    currencyPicker.dataSource = self 
    currencyPicker.delegate = self 

    //To dismiss keyboard 
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))) 
} 

override func viewWillAppear(_ animated: Bool) { 
    print("View will appear") 

    //Set value for currency picker 
    currencyPicker.selectedRow(inComponent: currencies.index(of: GenericStuff.currency)!) 
    print("Tried to set selectedRow") 

    pricePerHourTextField.text = String(describing: defaults.float(forKey: "pricePerMinute")) 
    isTimeCafeSwitch.isOn = defaults.bool(forKey: "isTimeCafe") 
} 

としている私の出力:

View did load 
View will appear 
Picker view initialized - getting number of rows 
Picker view initialized - getting number of rows 
Picker view initialized - getting number of rows 
Picker view initialized - getting number of rows 
2017-07-20 01:20:42.163 CafeManager[8135:265457] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 4 beyond bounds [0 .. 0]' 

だから私は順序がある見ることができるよう:

のviewDidLoadが呼ばれます - ここで私はデリゲートとデータソースを設定します。

viewWillAppearが呼び出される - ここで私はUIPickerが初期化を開始した

UIPicker

のためにするsetSelectedしようとしました。

ここでは並行性の問題があるようですが、正しく修正する方法がわかりません。そして、私は実際には上記の例でどのように働いているのだろうか。 selectedRowをviewDidLoadに入れようとしました - 同じ結果です。

答えて

0

さて、私は理由を見つけました。夜にコードを書かないでください。

私はが間違っています。 私が使用:

currencyPicker.selectedRow(inComponent: currencies.index(of: GenericStuff.currency)!) 

の代わりに:

currencyPicker.selectRow(currencies.index(of: GenericStuff.currency)!, inComponent: 0, animated: true) 

そして、それは正常に動作します。

関連する問題