在我的应用中,我有一个文本字段(距离),它具有分段控制以选择单位参考(Km / Mi):
我有另一个显示UIPickerView的文本字段(步调)。根据用户选择的单位,可以使用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
}
}
}
我不确定这是最好的方法。如果有一种更优雅的方式,我将非常乐意学习它。
答案 0 :(得分:1)
您没有在选择器视图中看到更改,因为在更改数据源后您没有重新加载数据。一旦更改了数据源,只需在reloadAllComponents
上调用pickerView
,就可以了。
func unitChanged(sender:UISegmentedControl) {
//Your previous code for changing the datasource array.
//Now reload the UIPickerView
pacePickerView.reloadAllComponents()
}
我想提出的另一个建议是,如果在两个数据源阵列中都有相同的键值对,那么你应该将第3个数组作为最终数据源并将其与你的相应数组进行切换。 unitChanged:
方法。这样,您不会不时需要if
条件来获取当前数据集。