根据第一个组件选择在 UIPickerView 第二个组件中显示数据

Posted

技术标签:

【中文标题】根据第一个组件选择在 UIPickerView 第二个组件中显示数据【英文标题】:Show data in UIPickerView second component based on first component selection 【发布时间】:2012-11-21 12:34:21 【问题描述】:

我正在使用带有两个组件的选择器。我想如果我根据所选组件在第一个组件中选择一行,它会显示相应数据的值。

正如 Picker 所展示的,当英格兰被选中时,英格兰拥有相应的俱乐部。我想为其他国家做同样的事情。但我不知道要遵循哪种方法。

这是我的代码:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView 


    return 2;


- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component 


    if(component ==0)
    
        return [Nations count];
    

    else
        if(country_flag==0)
        
        return [England count];
        
        else if (country_flag==1)
        
            return [Espana count];
        
        else if (country_flag==2)
        
            return [Netherlands count];
        
        else if (country_flag==3)
        
            return [Germany count];
        
        else if (country_flag==4)
        
            return [Italy count];
        
    

    return 0;

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

    if(component ==0)
    
        return [Nations objectAtIndex:row];
    

    else
        if(country_flag==0)
        
            return [England objectAtIndex:row];
        
        else if (country_flag==1)
        
            return [Espana objectAtIndex:row];
        
        else if (country_flag==2)
        
            return [Netherlands objectAtIndex:row];
        
        else if (country_flag==3)
        
            return [Germany objectAtIndex:row];
        
        else if (country_flag==4)
        
            return [Italy objectAtIndex:row];
        
    

    return 0;


- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component


    label.text=[Nations objectAtIndex:row];

    str = [[NSString alloc]init];

    if (country_flag==0) 
        str=@"England";
        label_1.text=[NSString stringWithFormat:@"%@",str];
        NSLog(@"%@",label_1);
        str=@"";
        country_flag =1;
        [picker reloadAllComponents];
    
    else if (country_flag==1)
    
        str=@"Espana";
        label_1.text=[NSString stringWithFormat:@"%@",str];
        NSLog(@"%@",label_1);
        str=@"";
        country_flag =2;
        [picker reloadAllComponents];
    
    else if (country_flag==2)
    
        str=@"Netherlands";
        label_1.text=[NSString stringWithFormat:@"%@",str];
        NSLog(@"%@",label_1);
        str=@"";
        country_flag =3;
        [picker reloadAllComponents];
    
    else if (country_flag==3)
    
        str=@"Germany";
        label_1.text=[NSString stringWithFormat:@"%@",str];
        NSLog(@"%@",label_1);
        str=@"";
        country_flag =4;
        [picker reloadAllComponents];
    
    else if (country_flag==4)
    
        str=@"Germany";
        label_1.text=[NSString stringWithFormat:@"%@",str];
        NSLog(@"%@",label_1);
        str=@"";
      //  country_flag =4;
        [picker reloadAllComponents];
    


编辑:

这是数据

Nations = [[NSMutableArray alloc]initWithObjects:@"England",@"Espana",@"Germany",@"Netherlands",@"Germany",@"Italy", nil];

    England=[[NSMutableArray alloc]initWithObjects:@"Arsenal",@"Chelsea",@"Manchester City",@"Manchester United",@"Liverpool",@"Tottenham",@"Fulham City",@"Stoke City",@"Sunderland",@"NewCastle United",@"Blackburn Rovers",@"Southampton",@"Wolvers",@"Aston Villa", nil];

    Espana = [[NSMutableArray alloc]initWithObjects:@"Barcelona",@"Real Madrid",@"Valencia",@"Athletico Madrid",@"Athletico Balbao",@"Getafe CF",@"Sevilla CF", nil];

    Netherlands = [[NSMutableArray alloc]initWithObjects:@"Celtics",@"Ajax",@"Amesterdam", nil];

    Germany = [[NSMutableArray alloc]initWithObjects:@"Bayern Munich",@"Bermen",@"Fiorentina",@"Pampas",@"Nord", nil];

    Italy = [[NSMutableArray alloc]initWithObjects:@"AC Milan",@"Inter Milan",@"Juventus", nil];

【问题讨论】:

尝试[picker reloadComponent:(NSInteger)component];而不是 [picker reloadAllComponents]; 感谢您的支持,但没有改变。 您的 country_flag 变量有些奇怪。你能告诉我们它是在哪里声明的吗?另外,为什么必须 country_flag == 1 才能选择 Espana? 我已声明 country_flag=0 但我正在尝试增加 didSelectRow 委托中的标志值。我知道我把标志弄得一团糟,指导我正确的代码。 【参考方案1】:

您的代码..稍作修改..

didSelectRow

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 

    if (component == 0) 
        club=[[NSString alloc] initWithFormat:@"%@" , [Nations objectAtIndex:row]];
        [pickerView reloadComponent:1];
          

之后……

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component 

    if(component ==0)
    
        return [Nations count];
    
    else 
        if ([club isEqualToString:@"Espana"]) 
            return [Espana count];
        
        if ([club isEqualToString:@"Germany"]) 
            return [Germany count];
        
        // if...
       else  
            return [England count];
        
    

    return 0;

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
    if(component ==0)
    
        return [Nations objectAtIndex:row];
    
    else 
        if ([club isEqualToString:@"Espana"]) 
            return [Espana objectAtIndex:row];
        
        if ([club isEqualToString:@"Germany"]) 
            return [Germany objectAtIndex:row];
        
        //if....
      else  
            return [England objectAtIndex:row];


        
    

    return 0;
    

UPD

在我有的h文件中

@interface ViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate> 

    IBOutlet UIPickerView *pickerView;
    NSMutableArray *arrayColors;
    NSMutableArray *Nations;
    NSMutableArray *England;
    NSMutableArray *Espana;
    NSMutableArray *Germany;
    NSString *club;

之后..您必须将 de pickerView 连接到您的 ViewController(数据源和委托)

【讨论】:

没有做任何改变...仍然没有得到除英格兰以外的其他国家的俱乐部名称。 进行改进..您可以在 viewDidLoad -> club=[[NSString alloc] initWithFormat:@"England"]; 中添加 好的...我有一个问题,您为什么要使用 Storyboard? 只是因为:“Storyboards 让您可以直观地绘制出应用程序中的所有视图以及它们之间的相互关系”,因为它更易于编码:) @DeepakKhiwani 但我认为你是对的,我的评论没用,就像我删除它们一样【参考方案2】:

通常你会这样做。 您创建一个包含所有国家/地区数据的 plist 文件 结果是这样的

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>England</key>
    <array>
        <string>Chelsea</string>
        <string>Arsenal</string>
    </array>
    <key>Spain</key>
    <array>
        <string>Barca</string>
        <string>Real</string>
    </array>
 </dict>
</plist>

假设以下是在属性中或某处定义的

NSDictionary *countryClubs;
NSArray *countries;
NSArray *clubs;

然后你就做这样的事情

- (void)viewDidLoad

    [super viewDidLoad];
    NSBundle *bundle = [NSBundle mainBundle];
    NSURL *plistFile = [bundle URLForResource:@"myPListFile" withExtension:@"plist"];
    NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:plistFile];
    self.countryClubs = dictionary;

    NSString *selectedCountry = [self.countries objectAtIndex:0];
    NSArray *array = [countryClubs objectForKey:selectedCountry];
    self.clubs = array;


- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
    return 2;


- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
    if (component == 0)
        return [self.countries count];
    return [self.clubs count];


- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row
        forComponent:(NSInteger)component 
    if (component == 0)
        return [self.countries objectAtIndex:row];
    return [self.clubs objectAtIndex:row];


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
       inComponent:(NSInteger)component 
       if (component == 0) 
         NSString *selectedCountry = [self.countries objectAtIndex:row];
         NSArray *array = [countryClubs objectForKey:selectedCountry];
         self.clubs = array;
         [picker selectRow:0 inComponent:1 animated:YES];
         [picker reloadComponent:1];
    

这应该对您有所帮助。我希望没有太多的拼写错误,但您至少应该了解大致的概念。

【讨论】:

按照你的方法,我应该删除包含国家名称和俱乐部名称的数组吗? 不确定我是否理解您的意思是“删除我的阵列”。正如我的示例所示,通常您有一个全局字典,其中包含以国家为键的所有数据,并将生成的俱乐部作为子数组。然后为您的选择器保留 2 个数据数组。 1 表示您不会删除/重新加载的国家/地区,1 表示每次更改国家/地区时都会刷新/更改的俱乐部。【参考方案3】:

我认为问题出在您的didSelectRow 方法中。在允许选择一个新国家之前,您检查已经选择了哪个国家(在country_flag)。我认为没有任何理由这样做。

允许选择任何国家。然后根据选中的行设置country_flag

只要country_flag = row+1;

如果这很重要,您可以让您的 if 语句设置您的标签。

【讨论】:

【参考方案4】:

看看这个,我想它可以帮助你

    首先确保您已将选择器与 IBOutlet .

    如果遇到问题,仍然可以使用

[thePickerView reloadComponent:(NSInteger)component];

而不是

[picker reloadComponent:(NSInteger)component]; 

【讨论】:

[picker reloadComponent:(NSInteger)component];不工作 我只获得关于英格兰的数据。我无法为其他国家获得。即使我滚动国家/地区,右侧(阿森纳....)的数据也保持不变。 检查其他国家/地区数组中的值,例如西班牙和其他国家/地区,并确保它们的值不同。 我已经发布了我的数据……看看吧。

以上是关于根据第一个组件选择在 UIPickerView 第二个组件中显示数据的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView 选择的第一个组件决定第二个组件的内容不同步

UIPickerView 取决于第一个组件

Swift UIPickerView 第一个组件更改第二个组件数据

标签上显示的 UIPickerView 选项

正确使用带有两个数字组件的 UIPickerVIew

UIPickerView 依赖于 UITableView