在 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 应符合 UIPickerViewDelegate
和 UIPickerViewDataSource
。喜欢
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 ""
}
这就是你要的吗?
我可以在这里看到几个选项:
为每个选择器使用不同的委托对象
picker1.delegate = firstDelegate()
picker2.delegate = secondDelegate()
在每个委托对象中以不同方式实现所需的委托方法。
在视图控制器(或 IBOutlet)中保留对每个选择器的引用
let picker1 = ...
let picker2 = ...
然后在你的委托方法中
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView == picker1 {
...
}
}
我在 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 应符合 UIPickerViewDelegate
和 UIPickerViewDataSource
。喜欢
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 ""
}
这就是你要的吗?
我可以在这里看到几个选项:
为每个选择器使用不同的委托对象
picker1.delegate = firstDelegate() picker2.delegate = secondDelegate()
在每个委托对象中以不同方式实现所需的委托方法。
在视图控制器(或 IBOutlet)中保留对每个选择器的引用
let picker1 = ... let picker2 = ...
然后在你的委托方法中
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if pickerView == picker1 { ... } }