PickerView - 如何 return 2 个基于分段控件选择的不同数组
PickerView - How to return 2 different array based on a segmented Control selection
在我的应用程序中,我有一个文本字段(距离),它具有分段控件以选择单位参考(Km/Mi):
我有另一个显示 UIPickerView 的文本字段 (pace)。这个选择器视图可以根据用户选择的单位填充 2 个数组。一切正常,除了,即使没有显示选择器视图并且我更改了选择,数组也只有在我开始滚动选择器视图时才会改变。所以最初它以公里为单位显示数组,即使我选择了 Mi,然后当我开始移动选择器时它会改变。
最初我为单位引用和 2 个数组设置了一个变量
var unitReference = "Km" // this is the initial selection on the segmented control
let paceKmArray = [" ", "Relaxing(less than 15km/h)", "Easy(15km/h-20km/h)","Medium(20km/h-25km/h)","Nice(25km/h-30km/h)","Fast(30km/h-35km/h)", "Very Fast(>35km/h)"]
let paceMiArray = [" ", "Relaxing(less than 10 mi/h)", "Easy(10mi/h-13mi/h)","Medium(13mi/h-16mi/h))","Nice(16mi/h-19mi/h))","Fast(19mi/h-12mi/h))", "Very Fast(>22mi/h)"]
然后在 viewDidLoad
unitReferenceSegmentedControl.addTarget(self, action: "unitChanged:", forControlEvents: .ValueChanged);
调用此方法更改单位引用
func unitChanged(sender:UISegmentedControl){
if sender.selectedSegmentIndex == 0{
unitReference = "Km"
print(unitReference)
}
if sender.selectedSegmentIndex == 1{
unitReference = "Mi"
print(unitReference)
}
}
以及选择器视图方法
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView.tag == 0{
return rideTypeArray[row]
}
if pickerView.tag == 1{
if unitReference == "Km"{
return paceKmArray[row]
}
if unitReference == "Mi"{
return paceMiArray[row]
}
}
return ""
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
if pickerView.tag == 0{
return rideTypeArray.count
}
if pickerView.tag == 1{
if self.unitReference == "Km"{
return paceKmArray.count
}
if self.unitReference == "Mi"{
return paceMiArray.count
}
}
return 0
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
if pickerView.tag == 0{
rideTypeTextField.text = rideTypeArray[rideTypePickerView!.selectedRowInComponent(0)] as String
}
if pickerView.tag == 1{
if unitReference == "Km"{
paceTextField.text = paceKmArray[pacePickerView!.selectedRowInComponent(0)] as String
}
if unitReference == "Mi"{
paceTextField.text = paceMiArray[pacePickerView!.selectedRowInComponent(0)] as String
}
}
}
我不确定这是最好的方法。如果有更优雅的方法来做,我会非常乐意学习。
您没有在选取器视图中看到更改,因为您没有在数据源更改后重新加载数据。更改数据源后,只需在 pickerView
上调用 reloadAllComponents
就可以了。
func unitChanged(sender:UISegmentedControl) {
//Your previous code for changing the datasource array.
//Now reload the UIPickerView
pacePickerView.reloadAllComponents()
}
我想给出的另一个建议是,如果两个数据源数组都具有相同的键值对集,那么您应该保留第三个数组作为最终数据源,并将其与 unitChanged:
方法。这样你就不需要时不时地有一个 if
条件来获取当前的数据集。
在我的应用程序中,我有一个文本字段(距离),它具有分段控件以选择单位参考(Km/Mi):
我有另一个显示 UIPickerView 的文本字段 (pace)。这个选择器视图可以根据用户选择的单位填充 2 个数组。一切正常,除了,即使没有显示选择器视图并且我更改了选择,数组也只有在我开始滚动选择器视图时才会改变。所以最初它以公里为单位显示数组,即使我选择了 Mi,然后当我开始移动选择器时它会改变。
最初我为单位引用和 2 个数组设置了一个变量
var unitReference = "Km" // this is the initial selection on the segmented control
let paceKmArray = [" ", "Relaxing(less than 15km/h)", "Easy(15km/h-20km/h)","Medium(20km/h-25km/h)","Nice(25km/h-30km/h)","Fast(30km/h-35km/h)", "Very Fast(>35km/h)"]
let paceMiArray = [" ", "Relaxing(less than 10 mi/h)", "Easy(10mi/h-13mi/h)","Medium(13mi/h-16mi/h))","Nice(16mi/h-19mi/h))","Fast(19mi/h-12mi/h))", "Very Fast(>22mi/h)"]
然后在 viewDidLoad
unitReferenceSegmentedControl.addTarget(self, action: "unitChanged:", forControlEvents: .ValueChanged);
调用此方法更改单位引用
func unitChanged(sender:UISegmentedControl){
if sender.selectedSegmentIndex == 0{
unitReference = "Km"
print(unitReference)
}
if sender.selectedSegmentIndex == 1{
unitReference = "Mi"
print(unitReference)
}
}
以及选择器视图方法
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView.tag == 0{
return rideTypeArray[row]
}
if pickerView.tag == 1{
if unitReference == "Km"{
return paceKmArray[row]
}
if unitReference == "Mi"{
return paceMiArray[row]
}
}
return ""
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
if pickerView.tag == 0{
return rideTypeArray.count
}
if pickerView.tag == 1{
if self.unitReference == "Km"{
return paceKmArray.count
}
if self.unitReference == "Mi"{
return paceMiArray.count
}
}
return 0
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
if pickerView.tag == 0{
rideTypeTextField.text = rideTypeArray[rideTypePickerView!.selectedRowInComponent(0)] as String
}
if pickerView.tag == 1{
if unitReference == "Km"{
paceTextField.text = paceKmArray[pacePickerView!.selectedRowInComponent(0)] as String
}
if unitReference == "Mi"{
paceTextField.text = paceMiArray[pacePickerView!.selectedRowInComponent(0)] as String
}
}
}
我不确定这是最好的方法。如果有更优雅的方法来做,我会非常乐意学习。
您没有在选取器视图中看到更改,因为您没有在数据源更改后重新加载数据。更改数据源后,只需在 pickerView
上调用 reloadAllComponents
就可以了。
func unitChanged(sender:UISegmentedControl) {
//Your previous code for changing the datasource array.
//Now reload the UIPickerView
pacePickerView.reloadAllComponents()
}
我想给出的另一个建议是,如果两个数据源数组都具有相同的键值对集,那么您应该保留第三个数组作为最终数据源,并将其与 unitChanged:
方法。这样你就不需要时不时地有一个 if
条件来获取当前的数据集。