如何从第一个组件选择中加载UIPickerView的第二个组件中的数据

时间:2016-10-04 15:29:19

标签: ios objective-c xcode7 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]];
    }
}

当我的第一个组件选择是第一个选择&#34;类型1&#34;时,在我的第二个组件中,我看到来自NSMutableArray&#34; maListeSousTypes&#34;和&#34; maListeSousTypes2&#34;像这里一个接一个: Screenshot

当&#34; Type 2&#34;从第一个组件中选择,我的第二个组件是空的。

1 个答案:

答案 0 :(得分: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

随意询问您是否理解不了解。