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
在我的选择器视图中,我希望默认行为零。此行的值为 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