为 UIPicker 设置 selectedRow 的问题
Issue with setting selectedRow for UIPicker
我在为 UIPicker 设置初始值时遇到问题。
我有:
UI故事板中的选择器。连接到 TableViewController(我有静态 table)class 作为 IBOutlet:
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!
我以this答案为例来设置初始值。
但是我得到 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 被调用 - 这里我设置了委托和数据源。
viewWillAppear 被调用 - 在这里我尝试为 UIPicker
setSelected
UI选择器开始初始化。
看来我这里有并发问题,但不确定如何正确修复它。我真的很想知道它在提到的例子中是如何工作的。试图将 selectedRow 放入 viewDidLoad - 结果相同。
好的,找到原因了:不要熬夜写代码
我使用了错误的函数。
我用过:
currencyPicker.selectedRow(inComponent: currencies.index(of: GenericStuff.currency)!)
而不是:
currencyPicker.selectRow(currencies.index(of: GenericStuff.currency)!, inComponent: 0, animated: true)
而且效果很好。
我在为 UIPicker 设置初始值时遇到问题。 我有: UI故事板中的选择器。连接到 TableViewController(我有静态 table)class 作为 IBOutlet:
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!
我以this答案为例来设置初始值。 但是我得到 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 被调用 - 这里我设置了委托和数据源。
viewWillAppear 被调用 - 在这里我尝试为 UIPicker
setSelectedUI选择器开始初始化。
看来我这里有并发问题,但不确定如何正确修复它。我真的很想知道它在提到的例子中是如何工作的。试图将 selectedRow 放入 viewDidLoad - 结果相同。
好的,找到原因了:不要熬夜写代码
我使用了错误的函数。 我用过:
currencyPicker.selectedRow(inComponent: currencies.index(of: GenericStuff.currency)!)
而不是:
currencyPicker.selectRow(currencies.index(of: GenericStuff.currency)!, inComponent: 0, animated: true)
而且效果很好。