如何更改由事件触发的pickerviews的值

时间:2015-05-28 08:18:23

标签: ios swift uipickerview

我想用uipickerview创建我自己的日期选择器,我可以在公元前9999年之间做出选择。和2015年A.D.我使用UIPickerview和多个组件。我的前4个组件只包含数字0-9。 组件1持有数千年(1000,2000 usw ...)。 我的最后一个部分包含{A.D. &安培;公元前。)。根据最后一个Picker,我会改变组件1的值,它代表年份的thousender。如果用户选择“A.D.”在最后一个组件中,不应该在第一个组件中选择3-9。

如何实现这一目标?

代码:

      func showDatePicker(){
            var datePicker=UIPickerView()
            datePicker.frame=CGRectMake(1, 100, 250, 162)
            datePicker.delegate=self
            datePicker.dataSource = self
            datePicker.tag = 1
            datePicker.backgroundColor=UIColor.orangeColor();
            datePicker.selectRow(180, inComponent: 0, animated: true)
            self.view.addSubview(datePicker)

        }
        func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int {
            return 5
        }

        func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int {


            println("evaluate amount of components");

            if component == 0{
                return 10
            }else if component == 1{
                return 10
            }else if component == 2{
                return 10
            }else if component == 3{
                return 10
            }else if component == 4{
                return 2
            }

            return 10
        }

        func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int) -> String! {

            if component == 0{
                return "\(row)"
            }else if component == 1{
                return "\(row)"
            }else if component == 2{
                return "\(row)"
            }else if component == 3{
                return "\(row)"
            }else if component == 4{
                if(row==0){
                    return "A.D.";
Here I like to limit the values of component 1 to {0,1,2}, because
the year should not go over the year 3000 A.D.
                }else{
                    return "B.C.";

                }
            }else{
                return "?";
            }
        }

**更新我的解决方案**

我不知道这是不是最佳做法,但我解决了以下问题: 根据年份,我在选择器视图中显示不同数量的值:

func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int {


        println("evaluate amount of components");

        let iYear=DataContainer.sharedInstance.iYear;
        if(iYear > 0){

            if component == 0{
                return 3;
            }else if component == 1{
                return 10;
            }else if component == 2{
                return 10;
            }else if component == 3{
                return 10;
            }else if component == 4{
                return 2;
            }else{
                return 1;
            }

        }else{
            if component == 0{
                return 10
            }else if component == 1{
                return 10
            }else if component == 2{
                return 10
            }else if component == 3{
                return 10
            }else if component == 4{
                return 2
            }else{
                return 1;
            }

        }

    }

当我更改我的最后一个组件(5)时,显示“A.D.”或“B.C.”我只是刷新了挑选者视图:

func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int) -> String! {
...
else if component == 4{
            if(row==0){
                if (iYear < 0 ){
                    //DataContainer.sharedInstance.iYear = -iYear;
                    datePicker.reloadAllComponents();
                }
                return "A.D.";
            }else{
                if (iYear > 0 ){
                    //DataContainer.sharedInstance.iYear = -iYear;
                    datePicker.reloadAllComponents();
                }
                //datePicker.reloadAllComponents();
                return "B.C.";
            }
        }

1 个答案:

答案 0 :(得分:1)

显然,你必须对第5个组件的变化作出反应。在pickerView(didSelectRow:inComponent)处理A.D.的更改。也许保留一个标志,指示选择了哪一个。

然后致电reloadComponent()reloadAllComponents以更新选择器视图。