2016-10-04 29 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

相關問題