2016-10-04 2 views
1

Я попытался найти решение для своей проблемы уже более недели, но без успеха с другими подобными вопросами на этом веб-сайте.Как загрузить данные во втором компоненте UIPickerView с первого выбора компонентов

У меня есть несколько NSMutableArrays для моего pickerView, и я пытаюсь установить данные второго компонента на основе выбора первого компонента. Моя основная проблема заключается в том, что данные второго компонента пусты, когда я выбираю ничего, кроме первого выбора в первом компоненте. Когда выбран первый выбор в первом компоненте, у меня есть все мои массивы вместе один за другим в моем втором компоненте, но я хочу только 1 массив на данные компонента.

Это мой код в ViewController.h:

@interface ViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate> 

{ 
    NSMutableArray *maListeTrier; 
    NSMutableArray *maListeTypes; 
    NSMutableArray *maListeSousTypes; 
    NSMutableArray *maListeSousTypes2; 
    NSMutableArray *maListeSousTypes3; 
    NSMutableArray *maListeSousTypes4; 
    NSMutableArray *maListeSousTypes5; 
} 

@property NSString *selectedType; 
@property NSString *selectedArray; 

@property (weak, nonatomic) IBOutlet UIPickerView *pickerView; 
@property (weak, nonatomic) IBOutlet UILabel *labelType; 
@property (weak, nonatomic) IBOutlet UILabel *labelSousType; 

И это мой код ViewController.m:

@synthesize selectedType; 
@synthesize selectedArray; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    selectedType=[[NSString alloc]init]; 
    selectedArray=[[NSString alloc]init]; 

    maListeTypes = [[NSMutableArray alloc] init]; 
    [maListeTypes addObject:@"Type 1"]; 
    [maListeTypes addObject:@"Type 2"]; 

    maListeSousTypes=[[NSMutableArray alloc]init]; 
    [maListeSousTypes addObject:@"Sous-type 1"]; 
    [maListeSousTypes addObject:@"Sous-type 2"]; 
    [maListeSousTypes addObject:@"Sous-type 3"]; 
    [maListeSousTypes addObject:@"Sous-type 4"]; 
    [maListeSousTypes addObject:@"Sous-type 5"]; 

    maListeSousTypes2=[[NSMutableArray alloc]init]; 
    [maListeSousTypes addObject:@"22222"]; 
    [maListeSousTypes addObject:@"22222"]; 
    [maListeSousTypes addObject:@"22222"]; 
    [maListeSousTypes addObject:@"22222"]; 
    [maListeSousTypes addObject:@"22222"]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

//Méthode pour déterminer le nombre de colonnes dans chaque picker view 
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
    return 2; 
} 

//Méthode pour déterminer le nombre de rangées dans chaque picker view 
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    if(component==0){ 
     return [maListeTypes count]; 
    } 
    else if(component==1){ 
     if([selectedType isEqualToString:@"Type 1"]){ 
      return [maListeSousTypes count]; 
     } 
     else if([selectedType isEqualToString:@"Type 2"]){ 
      return [maListeSousTypes2 count]; 
     } 
     else{ 
      return 0; 
     } 
    } 
    else{ 
     return 0; 
    } 
} 

//Méthode pour indiquer quoi afficher comme choix dans chaque picker view 
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    if(component==0){ 
     return [maListeTypes objectAtIndex:row]; 
    } 
    else{ 
     if([selectedType isEqualToString:@"Type 1"]){ 
      return [maListeSousTypes objectAtIndex:row]; 
     } 
     else{ 
      return [maListeSousTypes2 objectAtIndex:row]; 
     } 
    } 
} 

//Méthode pour indiquer quelle action va se produire lorsqu'on clique sur un des choix des picker views 
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ 
    if(component==0){ 
     selectedType=[maListeTypes objectAtIndex:row]; 
     [pickerView reloadAllComponents]; 
     _labelType.text=[maListeTypes objectAtIndex:[pickerView selectedRowInComponent:0]]; 
    } 
    else if(component==1){ 
     _labelSousType.text=[maListeSousTypes objectAtIndex:[pickerView selectedRowInComponent:1]]; 
    } 
} 

Когда мой первый выбор компонентов является первым выбором «Тип 1 », на втором компоненте я вижу данные NSMutableArray„maListeSousTypes“и„maListeSousTypes2“один за другим, как здесь: Screenshot

Когда «Первый тип» выбран из первого компонента, мой второй компонент пуст.

+0

Вы никогда ничего не добавите к 'maListeSousTypes2'. Я подозреваю, что вы скопировали и наклеили неправильно. '[maListeSousTypes addObject: @" 22222 "];' просто добавляет к 'maListeSousTypes', который вы уже добавили в' NSString' ранее. – beyowulf

+0

Спасибо вам большое! Это то, чего я отсутствовал, и не смотрел на правую часть моего кода. Сейчас все работает. – Vomarhk

ответ

0

Это должно быть проще, чем то, что вы делаете. Позвольте мне показать вам, как я сделал это в быстрый пример:

@interface ViewController() <UIPickerViewDataSource, UIPickerViewDelegate> 

@property (strong, nonatomic) IBOutlet UIPickerView *pickerView; 

@property (nonatomic, strong) NSArray *leftComponentItems; // Items from this array will populate the left component 
@property (nonatomic, strong) NSArray *rightComponentItemsA; // Items from this array will populate the right component, when the 1st row of the left component is selected 
@property (nonatomic, strong) NSArray *rightComponentItemsB; // Items from this array will populate the right component, when the 2nd row of the left component is selected 

@property (nonatomic, assign) NSInteger selectedLeftRow; // This keeps track of the selected row on the left component (you could take that from the datasource as well) 

@end 

, а затем в вашей реализации:

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.selectedLeftRow = 0; 

    self.leftComponentItems = @[@"first", @"second"]; 

    self.rightComponentItemsA = @[@"A1", @"A2", @"A3", @"A4", @"A5"]; 
    self.rightComponentItemsB = @[@"B1", @"B2", @"B3", @"B4", @"B5", @"B6", @"B7"]; 
} 

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
    return 2; // We have left & right components, this will always be "2" 
} 

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    if (component == 0) { 
     return self.leftComponentItems.count; 
    } 

    if (component == 1) { 
     if (self.selectedLeftRow == 0) { 
      return self.rightComponentItemsA.count; 
     } else { 
      return self.rightComponentItemsB.count; 
     } 
    } 

    return 0; 
} 

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

    if (component == 0) { 
     return self.leftComponentItems[row]; 
    } 

    if (component == 1) { 
     if (self.selectedLeftRow == 0) { 
      return self.rightComponentItemsA[row]; 
     } else { 
      return self.rightComponentItemsB[row]; 
     } 
    } 

    return @"default"; 

} 

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    if (component == 0) { 
     self.selectedLeftRow = row; // We keep track of the selected row 
     [pickerView reloadComponent:1]; // When we select a row in the left component, update the data on the right component 
    } 
} 

@end 

Не стесняйтесь спросить, если вы не понимаете.

+0

Это слишком сложно для начинающего, как я, к сожалению. Я хотел сделать что-то простое, как код, который у меня есть, но я чувствую, что чего-то не хватает, чего я просто не вижу. Мне просто нужно знать, почему мой второй компонент не имеет каких-либо данных и адаптирует код как можно ближе к тому, что выглядит на мой взгляд, независимо от того, какую память занимает это приложение, или более профессиональный способ сделать это, как это делается для новичков , – Vomarhk

+0

Я думаю, что мой код похож на ваш. Поскольку ваш вопрос не очень ясен, я подумал, что будет легче продемонстрировать рабочий пример. Изучите код и спросите, не понимаете ли вы что-то. – phi