PickerView 已选择默认行,但 returns 为零,除非移动了选取器视图

PickerView Default row selected but returns zero unless the picker view is moved

在我的选择器视图中,我希望默认行为零。此行的值为 1。除了按钮外,我希望能够触摸视图控制器上的任何内容。我知道有类似的问题,但它们对我不起作用。

override func viewWillAppear(_ animated: Bool) {

    self.pickerView.delegate = self
    self.pickerView.dataSource = self


    self.pickerView.selectRow(0, inComponent: 0, animated: true)

      }


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

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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return numbers.count

}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

     therow = pickerView.selectedRow(inComponent: 0) + 1        
}

然后

@IBAction func submitTapped(_ sender: Any) { Print (therow) }

当我点击提交并打印第 0 行的值时,它是 0,但是如果我摆动选择器视图并将其放回第 0 行,那么它会打印 1。我需要能够触摸选择器上的任何东西查看并设置 return 默认行的正确值。

你应该使用 pickerview delegate 方法给你的 row ,所以你应该修改你的代码如下:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

     therow = numbers[row]   
     //theRowIndex = row   //this is the index of row that you selected


}

例如,如果 numbers 数组是数字 = [1, 2, 3, 4],当您点击第一行时,上面的代码会将 therow 设置为 1,如果您点击第二行行,它会将 therow 设置为 2,依此类推。

如果你想使用你写的代码,那么你可以使用如下:

therow = numbers[pickerView.selectedRow(inComponent: 0)]

这将为您提供所选行的编号,但我认为您在上述方法中不需要它。

现在,如果您不想触摸选择器,那么我认为您需要这样做:

@IBAction func submitTapped(_ sender: Any) { 
       therow =  numbers[self.pickerView.selectedRow(inComponent: 0)]
       print(therow)

 }

用数据加载选择器视图后使用此语句。

yourPicker.selectRow(0, inComponent:0, animated:true)

您可以通过更改 selectRow 的第一个参数来更改默认选择值。

我认为发生这种情况的原因是,如果您以编程方式选择该行,则 didSelectRow 不会以某种方式被调用。根据 docs:

Called by the picker view when the user selects a row in a component.

因此您需要在调用 selectRow:

后以编程方式设置 therow 属性
self.pickerView.selectRow(0, inComponent: 0, animated: true)
therow = 1 // <--- this line