Swift: UIpickerView 在 UIlabel 上返回数字
Swift: UIpickerView returning numbers on UIlabel
我的 UIpickerView 中有 3 个组件,我想 return UIpickerView 上显示的所有 3 个数字,但它只是 return 最后一个被选中的数字。换句话说,UIlabel 只显示一位数字。这是我目前所拥有的
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var pickerView: UIPickerView!
let numbers = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 3
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return numbers[row]
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return numbers.count
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
label.text = numbers[row]
}
UILabel
只显示一位数字,因为您只告诉它显示最近选择的数字。相反,您需要询问 UIPickerView
为每个组件选择的索引是什么。像
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
label.text = (0..<3).map({ "\(pickerView.selectedRow(inComponent: [=10=]))" }).joined()
}
因为选择器视图包含多个组件,所以在 didSelectRow
委托方法中实现 label.text = numbers[row]
是不够的,这导致 - 正如您在问题中提到的那样 - 阅读 仅 第一个 组件的值。
为了更清楚,如果您尝试将 label.text = numbers[row]
更改为 label.text = numbers[pickerView.selectedRow(inComponent: 1)]
,您应该注意到标签文本将是 second 的值选择器视图,因为 selectedRow(inComponent:) - component
参数是:
A zero-indexed number identifying a component of the picker view.
粗略地说,如果您想从所有组件中获取值,则必须确定要读取哪个组件,在您的情况下是三个组件。
我认为最简单的静态方法是:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
label.text = "\(numbers[pickerView.selectedRow(inComponent: 0)])\(numbers[pickerView.selectedRow(inComponent: 1)])\(numbers[pickerView.selectedRow(inComponent: 2)])"
}
但可以肯定的是,像这样的东西 - 使用 Higher-order functions- would be much preferred (mainly, same logic of ,有一个非常简单的改进):
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
label.text = (0...2).map { "\(numbers[pickerView.selectedRow(inComponent: [=11=])])" }.joined()
}
请检查:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let val1 = numbers[pickerView.selectedRow(inComponent: 0)]
let val2 = numbers[pickerView.selectedRow(inComponent: 1)]
let val3 = numbers[pickerView.selectedRow(inComponent: 2)]
label.text = "\(val1) \(val2) \(val3)"
}
我的 UIpickerView 中有 3 个组件,我想 return UIpickerView 上显示的所有 3 个数字,但它只是 return 最后一个被选中的数字。换句话说,UIlabel 只显示一位数字。这是我目前所拥有的
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var pickerView: UIPickerView!
let numbers = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 3
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return numbers[row]
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return numbers.count
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
label.text = numbers[row]
}
UILabel
只显示一位数字,因为您只告诉它显示最近选择的数字。相反,您需要询问 UIPickerView
为每个组件选择的索引是什么。像
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
label.text = (0..<3).map({ "\(pickerView.selectedRow(inComponent: [=10=]))" }).joined()
}
因为选择器视图包含多个组件,所以在 didSelectRow
委托方法中实现 label.text = numbers[row]
是不够的,这导致 - 正如您在问题中提到的那样 - 阅读 仅 第一个 组件的值。
为了更清楚,如果您尝试将 label.text = numbers[row]
更改为 label.text = numbers[pickerView.selectedRow(inComponent: 1)]
,您应该注意到标签文本将是 second 的值选择器视图,因为 selectedRow(inComponent:) - component
参数是:
A zero-indexed number identifying a component of the picker view.
粗略地说,如果您想从所有组件中获取值,则必须确定要读取哪个组件,在您的情况下是三个组件。
我认为最简单的静态方法是:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
label.text = "\(numbers[pickerView.selectedRow(inComponent: 0)])\(numbers[pickerView.selectedRow(inComponent: 1)])\(numbers[pickerView.selectedRow(inComponent: 2)])"
}
但可以肯定的是,像这样的东西 - 使用 Higher-order functions- would be much preferred (mainly, same logic of
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
label.text = (0...2).map { "\(numbers[pickerView.selectedRow(inComponent: [=11=])])" }.joined()
}
请检查:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let val1 = numbers[pickerView.selectedRow(inComponent: 0)]
let val2 = numbers[pickerView.selectedRow(inComponent: 1)]
let val3 = numbers[pickerView.selectedRow(inComponent: 2)]
label.text = "\(val1) \(val2) \(val3)"
}