2011-12-08 12 views
3

私が最初にUIPickerView使用2 UIPickerView

- (void)viewDidLoad 
    NSURL *url = [NSURL URLWithString: 
         @"http://localhost:8080/Data/resources/converter.country/"]; 
     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
     [request setDelegate:self]; 
     [request startAsynchronous]; 
     // countrys = [[UIPickerView alloc] init]; 
     countrys.delegate = self; 
     countrys.dataSource = self; 
     countrys.showsSelectionIndicator = YES; 
     countryField.inputView=countrys; 


    - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
     NSString *codeCity; 
     codeCity=[countriesArray objectAtIndex:row]; 
     return codeCity; 
    } 

    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
     return 1; 
    } 

    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
     return [countriesCodeArray count]; 
    } 

ため、このコードを書いたし、私は都市で別のUIPickerViewを作りたかったです。私はこれを書いた

citys.delegate = self; 
    citys.dataSource = self; 
    citys.showsSelectionIndicator = YES; 
    cityField.inputView=citys; 

しかし、私がそれをクリックすると私は国のリストを持っています。データソースをどのように変更する必要がありますか?また、numberOfComponentsInPickerView、numberOfRowsInComponent:...のようなUIPickerViewのデフォルト関数を使用する方法は、2番目のUIPickerView?

答えて

9

あなたがあなたのすべてのデータソース/デリゲートのコードでこれと同じメカニズムに従うべき

citysPickerview.tag = 2 

otherPickerview.tag = 1 


// then you can check for these tags in pickerview datasource/delegate methods like this - 

- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 

     NSString *title; 

     if (pickerview.tag == 1) // this is otherPickerview 
     { 
      title=[countriesArray objectAtIndex:row]; // your logic to get title for otherpickerview 


     } 
     else if (pickerview.tag == 2) // this is citysPickerview 
     { 
     title=[countriesArray objectAtIndex:row]; // your logic to get title for cityspickerview 


     } 

    return title; 

} 

をごpickerviewsにタグを割り当てることができ、その後、データソース/デリゲートメソッドでこれらのタグを確認することができます:)

+2

また、 "if(pickerView == cityPickerView)..."を使用することもできます。 – giuseppe

2

何2 UIPickerViewの場合はtagと設定します([countryPicker setTag:1]など)。これらのタグを使用して2つのピッカービューを区別します。

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
     return 1; 
} 
- (NSInteger)pickerView:(UIPickerView *)pickerView 
     numberOfRowsInComponent:(NSInteger)component 
{ 
    if([pickerView tag] == 1) 
     return [countryNames count]; 
    else 
     return [cityNames count]; 

} 
- (NSString *)pickerView:(UIPickerView *)pickerView 
titleForRow:(NSInteger)row 
forComponent:(NSInteger)component 
{ 
    if([pickerView tag] == 1) 
     return [countryNames objectAtIndex:row]; 
    else 
     return [cityNames count]; 

} 
+0

同じデータソースを使用して2つ以上のuipickerviewsを使用するには、唯一の方法です。 –

+0

はい...しかしあなたはあなたの投稿の前に他の答えを読むべきです..代わりに同様の回答を投稿しないでください既存の回答をupvote! – Saurabh

+1

ありがとうございます。それは重要ではありません。特に、2番目の応答がより完全であるためです – user567

0

より単純な解決策として、pickerViewポインタを比較するだけです。こうすることで、タグを使用する上での複雑さとメンテナンスが削減されます。

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    NSInteger numberOfRows = 0; 

    if (pickerView == countrys) { 
     numberOfRows = [countriesCodeArray count]; 
    } 
    else if (pickerView == citys) { 
     numberOfRows = [citysCodeArray count]; 
    } 

    return numberOfRows; 
} 

注:この回答はgiuseppeのコメントに基づいています。