为 UIPicker 设置 selectedRow 的问题

Posted

技术标签:

【中文标题】为 UIPicker 设置 selectedRow 的问题【英文标题】:Issue with setting selectedRow for UIPicker 【发布时间】:2017-07-19 22:29:03 【问题描述】:

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

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 设置选择

UIPicker 开始初始化。

看起来我在这里遇到了并发问题,但不知道如何正确解决它。我真的很想知道它在提到的例子中是如何工作的。试图将 selectedRow 放入 viewDidLoad - 结果相同。

【问题讨论】:

【参考方案1】:

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

我使用了错误功能。 我用过:

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

代替:

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

而且效果很好。

【讨论】:

你是个传奇。我遵循与您相同的路径,并且正在研究如何在未加载完整数据列表时选择行。我也有“selectedRow”而不是“selectRow”。

以上是关于为 UIPicker 设置 selectedRow 的问题的主要内容,如果未能解决你的问题,请参考以下文章

将 UITextField 的 inputView 属性设置为 UIPicker 在 Swift 中不起作用

UIPicker 深色 ios13 :

UIPicker 在横向模式下调整大小

UIPicker 作为 UITextfield 键盘的输入

PhoneGap iOS UIPicker 等效元素:以编程方式选择选项值

为键盘切换 UIPicker