1. 程式人生 > >IOS之簡單選擇器UIPickerView(省份+城市)

IOS之簡單選擇器UIPickerView(省份+城市)

     先介紹一下我們要實現什麼功能。有1個選擇器,有左右兩個輪子,做輪子選擇省份,右輪子選擇城市,其中選擇省份時,右邊的城市會自動更新。


1、首先,對UIPickerView繫結Delegate和DataSource到相應的ViewController。此處不再贅述。可以用程式碼或者Interface介面設定。

2、首先實現資料的初始化。

(1)在.h檔案中定義如下變數。其中provinces_cities.plist請見附件。

Cpp程式碼  收藏程式碼
  1. @interface IkrboyViewController : UIViewController{  
  2.     NSDictionary *dict;//用於儲存省份-城市的資料
      
  3.     NSArray *provinceArray;//省份的陣列  
  4.     NSArray *cityArray;//城市的陣列,在接下來的程式碼中會有根據省份的選擇進行資料更新的操作  
  5. }  

 (2)在.m的viewDidLoad方法中加上初始化資料的處理。具體處理在initPicker方法
 

Cpp程式碼  收藏程式碼
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view, typically from a nib.  
  5.     [self initPicker];  
  6. }  
  7. //初始化PickerView使用的資料來源  
  8. -(void)initPicker{  
  9.     NSBundle *bundle = [NSBundle mainBundle];  
  10.     NSString *plistPath = [bundle pathForResource:@"provinces_cities" ofType:@"plist"];  
  11.     dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];  
  12.     provinceArray = [dict allKeys];  
  13.     NSInteger selectedProvinceIndex = [self.pickerView selectedRowInComponent:0];  
  14.     NSString *seletedProvince = [provinceArray objectAtIndex:selectedProvinceIndex];  
  15.     cityArray = [dict objectForKey:seletedProvince];  
  16.     NSLog(@"%d",[provinceArray count]);  
  17. }  

 3、將資料繫結到UIPickerView

Cpp程式碼  收藏程式碼
  1. //以下3個方法實現PickerView的資料初始化  
  2. //確定picker的輪子個數  
  3. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {  
  4.     return 2;  
  5. }  
  6. //確定picker的每個輪子的item數  
  7. - (NSInteger)pickerView:(UIPickerView *)pickerView  
  8. numberOfRowsInComponent:(NSInteger)component {  
  9.     if (component == 0) {//省份個數  
  10.         return [provinceArray count];  
  11.     } else {//市的個數  
  12.         return [cityArray count];  
  13.     }  
  14. }  
  15. //確定每個輪子的每一項顯示什麼內容  
  16. #pragma mark 實現協議UIPickerViewDelegate方法  
  17. -(NSString *)pickerView:(UIPickerView *)pickerView  
  18.             titleForRow:(NSInteger)row forComponent:(NSInteger)component {  
  19.     if (component == 0) {//選擇省份名  
  20.         return [provinceArray objectAtIndex:row];  
  21.     } else {//選擇市名  
  22.         return [cityArray objectAtIndex:row];  
  23.     }  
  24. }  

 4.隨時監聽UIPickerView的滾動。

Cpp程式碼  收藏程式碼
  1. //監聽輪子的移動  
  2. - (void)pickerView:(UIPickerView *)pickerView  
  3.       didSelectRow:(NSInteger)row inComponent:(NSInteger)component {  
  4.     if (component == 0) {  
  5.         NSString *seletedProvince = [provinceArray objectAtIndex:row];  
  6.         cityArray = [dict objectForKey:seletedProvince];  
  7.         //重點!更新第二個輪子的資料  
  8.          [self.pickerView reloadComponent:1];  
  9.         NSInteger selectedCityIndex = [self.pickerView selectedRowInComponent:1];  
  10.         NSString *seletedCity = [cityArray objectAtIndex:selectedCityIndex];  
  11.         NSString *msg = [NSString stringWithFormat:@"province=%@,city=%@", seletedProvince,seletedCity];  
  12.         NSLog(@"%@",msg);  
  13.     }  
  14.     else {  
  15.         NSInteger selectedProvinceIndex = [self.pickerView selectedRowInComponent:0];  
  16.         NSString *seletedProvince = [provinceArray objectAtIndex:selectedProvinceIndex];  
  17.         NSString *seletedCity = [cityArray objectAtIndex:row];  
  18.         NSString *msg = [NSString stringWithFormat:@"province=%@,city=%@", seletedProvince,seletedCity];  
  19.         NSLog(@"%@",msg);  
  20.     }  
  21. }  

 附加說明:利用下面的程式碼,獲得UIPickerView的不同Component(滾輪)的選中的index。

Cpp程式碼  收藏程式碼
  1. NSInteger selectedProvinceIndex = [self.pickerView selectedRowInComponent:0];  
  2. NSInteger selectedCityIndex = [self.pickerView selectedRowInComponent:1];