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)"
}