Ios 基于第一个组件选择在UIPickerView第二个组件中显示数据

Ios 基于第一个组件选择在UIPickerView第二个组件中显示数据,ios,uipickerview,Ios,Uipickerview,我使用的选择器有两个组件。如果我在第一个组件中根据所选组件选择一行,它将显示相应数据的值 正如皮克所说,当英格兰队被选中时,英格兰队有相应的俱乐部。我想为其他国家做同样的事情。但我不知道该采用哪种方法 这是我的密码: - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView { return 2; } - (NSInteger)pickerView:(UIPickerView *)thePi

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

正如皮克所说,当英格兰队被选中时,英格兰队有相应的俱乐部。我想为其他国家做同样的事情。但我不知道该采用哪种方法

这是我的密码:

- (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];

看看这个,我想它能帮你

  • 首先,确保您已将选择器连接到 IBOutlet

  • 如果你得到了问题,你仍然可以使用

  • [PickerView重新加载组件:(NSInteger)组件]

    而不是

    [picker reloadComponent:(NSInteger)component]; 
    

    通常你是这样做的。 创建包含所有国家/地区数据的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>
    
    然后你就这样做

    - (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];
        }
    }
    

    这应该对你有帮助。我希望不会有太多的打字错误,但你至少应该知道大概的意思。

    我认为问题在于你的
    didSelectRow
    方法。在允许选择新国家之前,请检查已选择的国家(在
    国家/地区标志中)。我认为没有任何理由这样做

    允许选择任何国家/地区。然后根据选定的行设置
    国家/地区标志

    只要做
    country\u flag=row+1


    然后,您可以使用
    if
    语句来设置标签(如果这很重要)。

    您的代码。。稍加修改

    迪德罗

    - (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;
    }
    

    UPD

    在h文件中,我有

    @interface ViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate> {
    
        IBOutlet UIPickerView *pickerView;
        NSMutableArray *arrayColors;
        NSMutableArray *Nations;
        NSMutableArray *England;
        NSMutableArray *Espana;
        NSMutableArray *Germany;
        NSString *club;
    }
    
    @界面ViewController:UIViewController{
    IBUIPickerView*pickerView;
    NSMUTABLEARRY*阵列颜色;
    NSMUTABLEARAY*国家;
    NSMUTABLEARRY*英格兰;
    NSMUTABLEARRY*西班牙;
    NSMutableArray*德国;
    NSString*俱乐部;
    }
    
    在那之后。。您必须将de-pickerView连接到您的ViewController(数据源和委托)

    尝试[选择器重新加载组件:(NSInteger)组件];而不是[选择器重新加载所有组件];谢谢你的支持,但是没有变化。你的国旗变量有点奇怪。你能告诉我们在哪里申报吗?另外,为什么我必须先将country_flag==1才能选择Espana?我已经声明country_flag=0,但我正在尝试增加didSelectRow委托中的flag值。我知道我把标志弄得一团糟,给我一个正确的代码;不起作用,我只得到英国的数据。我不能去其他国家。即使我滚动国家,右侧(阿森纳…)的数据仍保持不变。检查其他国家数组(如西班牙和其他国家)中的值,确保它们不具有相同的值。我已发布了我的数据…查看一下。按照您的方法,我应该删除包含国家名称和俱乐部名称的数组吗?我不确定我是否理解您所说的“删除我的数组”是什么意思。正如我的示例所示,通常您有一个全局字典,其中所有数据都以国家为键,结果俱乐部作为子数组。然后为选择器保留两个数据数组。1个用于您不删除/重新加载的国家/地区,1个用于您每次更改国家/地区时刷新/更改的俱乐部。不进行任何更改…仍然无法获取除英格兰以外的其他国家/地区的俱乐部名称。为了改进。。您可以在viewDidLoad->club=[[NSString alloc]initWithFormat:@“England”];好的……我有一个问题,你为什么要使用故事板?只是因为:“故事板允许你直观地绘制出应用程序中的所有视图以及它们之间的相互关系”,因为更容易编码:)@DeepakKhiwani,但我认为你是对的,我的评论是无用的,这样说我就删除了它们
    - (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;
        }
    
    @interface ViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate> {
    
        IBOutlet UIPickerView *pickerView;
        NSMutableArray *arrayColors;
        NSMutableArray *Nations;
        NSMutableArray *England;
        NSMutableArray *Espana;
        NSMutableArray *Germany;
        NSString *club;
    }