2016-10-04 53 views
1

我试图为我的问题找到一个解决方案一个多星期了,但没有成功解决这个网站上的其他类似问题。如何从第一个组件选择中加载UIPickerView的第二个组件中的数据

我有我的pickerView多个NSMutableArrays,我试图根据第一个组件的选择设置第二个组件的数据。我的主要问题是,当我选择第一个组件中的第一个选项以外的任何其他组件时,第二个组件的数据是空的。当选择第一个组件的第一个选项时,我的所有数组都依次排列在第二个组件中,但每个组件数据只需要一个数组。

这是我在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

当从第一个组件中选择“类型2”时,我的第二个组件是空的。

+0

你永远不会向maListeSousTypes2添加任何东西。你错过了我怀疑的复制和粘贴错误。 '[maListeSousTypes addObject:@“22222”];'只是添加到'maListeSousTypes'中,您已经在'NSString's之前添加了一堆。 – 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

相关问题