Swift3 为UIPicker设置selectedRow时出现问题

Swift3 为UIPicker设置selectedRow时出现问题,swift3,concurrency,uipickerview,Swift3,Concurrency,Uipickerview,我对设置UIPicker的初始值有问题。 我有: 在我的故事板中的UIPicker。连接到TableViewController我将静态表类作为IBOutlet: 我用answer作为设置初始值的示例。 但我得到了NSRangeException,因为我想我正在尝试在UI选择器完全初始化之前为其设置值。我在代码中添加了一些打印以显示问题: func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 }

我对设置UIPicker的初始值有问题。 我有: 在我的故事板中的UIPicker。连接到TableViewController我将静态表类作为IBOutlet:

我用answer作为设置初始值的示例。 但我得到了NSRangeException,因为我想我正在尝试在UI选择器完全初始化之前为其设置值。我在代码中添加了一些打印以显示问题:

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-这里我设置委托和数据源

VIEWWILLEXPENCE被调用-在这里我试图为UIPicker设置SELECTED

UIPicker已开始初始化


看起来这里有并发问题,但不确定如何正确修复。我真的很想知道在上面提到的例子中它是如何工作的。尝试将selectedRow放入viewDidLoad-结果相同。

好的,我找到了原因:不要在夜间编写代码

我使用了错误的函数。 我用过:

而不是:

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

它工作正常。

好吧,我找到了原因:不要在晚上编写代码

我使用了错误的函数。 我用过:

而不是:

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

而且效果很好。

你是个传奇人物。我遵循了与您相同的路径,正在研究如何选择行,但似乎没有加载完整的数据列表。我也选择了Row而不是selectRow。你是个传奇人物。我遵循了与您相同的路径,正在研究如何选择行,但似乎没有加载完整的数据列表。我也选择了Row而不是selectRow。
currencyPicker.selectRow(currencies.index(of: GenericStuff.currency)!, inComponent: 0, animated: true)