PickerView - 如何根据分段控件选择

时间:2015-10-12 06:47:20

标签: ios swift uipickerview uisegmentedcontrol

在我的应用中,我有一个文本字段(距离),它具有分段控制以选择单位参考(Km / Mi):

enter image description here

我有另一个显示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
        }     

    }

}

我不确定这是最好的方法。如果有一种更优雅的方式,我将非常乐意学习它。

1 个答案:

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