2015-05-28 102 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

是的。或者我可能有點太急躁:-)我希望這個問題也能幫助其他人。 –

相關問題