2015-05-28 103 views
0

我想用uipickerview创建我自己的日期选择器,我可以在9999 B.C.之间进行选择。和2015年A.D.我使用UIPickerview和更多的组件。我的前4个组件仅包含数字0-9。 组件1拥有千年(1000,2000 usw ...)。 我最后的组件包含{A.D. B.C.)。取决于最后一个选择器,我会更改组件1的值,它代表了这些年的选择。如果用户选择了“A.D.”在最后一个组件中,不应该有可能在第一个组件中选择3-9。如何更改由事件触发的pickerviews的值

如何实现这一目标?

代码:

 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 "?"; 
      } 
     } 

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

我不知道这是不是最好的做法,但我解决了这个问题如下: 取决于我表现出不同年份pickerview中的值的数量:

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),其中显示“AD”或“B.C.”我只是刷新pickerview:

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

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

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

+0

非常感谢。我只是自己发泄。 Perhabs您可以在问题中查看我的更新以确认这是最佳做法吗?谢谢。 –

+0

看起来不错;-)。有时它有助于写出问题以清楚地理解问题。 – Mundi

+0

是的。或者我可能有点太急躁:-)我希望这个问题也能帮助其他人。 –

相关问题