Как отобразить 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;
и в delegate
methods
из UIPickerView
:
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if(pickerView.tag)
return self.firstArray.count;
else
return self.secondArray.count;
}
И так далее