Как отобразить 2 разных массива с использованием 2 разных сборщиков в одном контроллере вида?

Я получил модельный объект, который содержит фильмы и массивы актеров. Я пытаюсь заполнить 2 сборщика (1 сборщик фильмами, а другой актерами) в одном ViewController. Пожалуйста, помогите, так как я все еще учусь, как это работает.

Спасибо!

Мой код ниже...

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


    self.model = [[MovieModel alloc] init];


    for(int i = 0; i < self.model.count; i++){
        NSString *movies = [self.model movieForIndex:i];
        NSLog(@" Movie = %@", movies);
    }

    for(int i = 0; i < self.model.count; i++){
        NSString *actors = [self.model actorForIndex:i];
        NSLog(@" Actor = %@", actors);
    }


}

// Это место, где у меня проблемы. Спасибо!!!

#pragma mark - Picker View Delegate

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


    if (component == 0){

        return [self.model movieForIndex: row];

    }

    else if (component == 1){

        return [self.model actorForIndex: row];

    }

    else
        return nil;

}



#pragma mark - Picker View Data Source

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {

    return 1;

}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {

    return self.model.count;

}

@end

3 ответа

Вы заметите, что есть "pickerViewпараметр в методах источника данных. Этот параметр говорит вам, для какого из ваших двух сборщиков вы возвращаете данные.

Итак, допустим, вы связываете два вида выбора в два разных "IBOutlet"свойства или ivars (переменные экземпляра), например так:

IBOutlet UIPickerView * moviePicker;
IBOutlet UIPickerView * actorPicker;

Теперь в ваших методах источника данных вы можете делать такие вещи:

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


    if (pickerView == moviePicker){

        return [self.model movieForIndex: row];

    }

    else if (pickerView == actorPicker){

        return [self.model actorForIndex: row];

    }

    else
        return nil;

}

И сделайте что-то подобное для каждого из методов источника данных, которые вы хотите поддерживать. С тобой должно быть все в порядке!

Сначала вам нужно убедиться, что ваш ViewController реализует UIPickerViewDataSource и UIPickerViewDelegate.

Вам нужно добавить сборщик на ваш вид:

UIPickerView *moviesAndActorsPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
[moviesAndActorsPicker setDelegate:self];
[self.view addSubview:moviesAndActorsPicker];

Ваш сборщик состоит из двух компонентов - 1 для фильмов и 1 для актеров:

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

Затем установите количество строк для каждого компонента:

    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    // differentiate which component it is
    if (component == 0) { // movies
        return movies.count;
    }
    else { // component = actors
        return actors.count;
    }
}

Вы можете дать каждому сборщику tag следующим образом:

self.firstPicker.tag = 1;
self.secondPicker.tag = 2;

и в delegatemethods из UIPickerView:

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if(pickerView.tag)
    return self.firstArray.count;
    else
    return self.secondArray.count;
  }

И так далее

Другие вопросы по тегам