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 条件来获取当前的数据集。