how to display 2 different arrays using 2 different pickers in the same view controller?

1.2k Views Asked by At

I got a model object that contains movies and actors arrays. I'm trying to populate 2 pickers (1 picker with movies and the other with actors) in the same ViewController. Please help as I'm still learning how it works.

Thanks!

My code is below...

@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);
    }


}

//This is the place where I'm having issues. Thanks!!!

#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

There are 3 best solutions below

0
On

First you need to make sure your ViewController implements UIPickerViewDataSource and UIPickerViewDelegate.

You need to add the picker to your view:

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

Your picker has two components - 1 for movies and 1 for actors:

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

Then set the number of rows for each component:

    - (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;
    }
}
0
On

You'll notice that there's a "pickerView" parameter in the data source methods. This parameter tells you which of your two pickers you're returning data for.

So, let's say you connect your two picker views to two different "IBOutlet" properties or ivars (instance variables), like this:

IBOutlet UIPickerView * moviePicker;
IBOutlet UIPickerView * actorPicker;

Now, in your data source methods, you can do stuff like this:

- (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;

}

And do something like this for each of the data source methods you want to support. You should be just fine!

0
On

You can give each picker a tag as following:

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

and in the delegate methods of the UIPickerView:

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

And so on