использовать два UIPickerView в одном классе - PullRequest
3 голосов
/ 08 декабря 2011

Я написал этот код для первого 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;

Но когда я нажимаю на нее, у меня есть список стран. Как мне изменить источник данных? И как использовать функцию UIPickerView по умолчанию, такую ​​как numberOfComponentsInPickerView, numberOfRowsInComponent: ... со вторым UIPickerView?

Ответы [ 3 ]

9 голосов
/ 08 декабря 2011

Вы можете назначить тег для ваших сборщиков, а затем проверить эти теги в методах источника данных / делегата

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;

}

Вы должны следовать этому же механизму в своем коде источника данных / делегата:)

2 голосов
/ 08 декабря 2011

Что вы могли бы сделать, это установить tag для 2 UIPickerView, например, - [countryPicker setTag:1], используйте эти теги, чтобы различать 2 вида выбора.

0 голосов
/ 17 июня 2015

Для более простого решения, просто сравните указатель 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.

...