在 1 VC 中使用两个 UI 选择器,处理委托方法

Using Two UI Pickers in 1 VC, Handling Delegate methods

我在 1 个 VC 中有 2 个选取器,并且知道应该通过使用 if else 来确定每个选取器应该遵循哪些委托方法来处理这个问题。然而,我对解决这个问题还很陌生,我不确定我的方法应该返回什么才能让它们正常工作。

这是代码,我刚刚使用 0 和 "" 来防止代码错误,直到我能得到正确的 returns 整理出来。

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    if pickerView == repsPicker {
        return 1
    } else if pickerView == setsPicker {
        return 1
    }
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if pickerView == repsPicker {
        return repPickerValues.count
    } else if pickerView == setsPicker {
        return self.setsPickerValues.count
    }
    return 0
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if pickerView == repsPicker {
        return repPickerValues[row]
    } else if pickerView == setsPicker {
        return self.setsPickerValues[row]
    }
    return ""
}

您可以为每个选择器设置标签,以便区分它们。使用两个不同的值设置 pickerView.tag,并在每个委托方法中检查标记值以确定 return 值。

let repPickerValues = ["America", "Mexico", "Canada"]
let setsPickerValues = ["India", "China", "Malaysia", "Singapore"]

如果这些是您的值,那么您将在第一个选择器上有 3 个选项,在第二个选择器上有 4 个选项。

添加以下行将调用这些函数

repsPicker.delegate = self
setsPicker.delegate = self

并且您的视图控制器 class 应符合 UIPickerViewDelegateUIPickerViewDataSource。喜欢

class ViewController: UIPickerViewDelegate, UIPickerViewDatSource {

}

此函数将告诉选择器视图要显示多少个选项

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if pickerView == repsPicker {
        return repPickerValues.count
    } else if pickerView == setsPicker {
        return self.setsPickerValues.count
    }
    return 0
}

此函数负责在选择器视图中放置值

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if pickerView == repsPicker {
        return repPickerValues[row]
    } else if pickerView == setsPicker {
        return self.setsPickerValues[row]
    }
    return ""
}

这就是你要的吗?

我可以在这里看到几个选项:

  1. 为每个选择器使用不同的委托对象

    picker1.delegate = firstDelegate()
    picker2.delegate = secondDelegate()
    

    在每个委托对象中以不同方式实现所需的委托方法。

  2. 在视图控制器(或 IBOutlet)中保留对每个选择器的引用

    let picker1 = ...
    let picker2 = ...
    

    然后在你的委托方法中

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == picker1 { 
            ... 
        }
    }