【问题标题】:how to set the data in second component based on first component selection in UIPickerview如何根据 UIPickerview 中的第一个组件选择设置第二个组件中的数据
【发布时间】:2014-06-27 14:00:36
【问题描述】:

我正在使用具有三个组件的 UIpicker。我想如果我根据所选组件在第一个组件中选择一行,它会显示第二个组件中相应数据的值。 我使用数组作为第一个组件值,例如 @"UK",@"US",@"EU"。现在我想如果用户在第一个组件中选择了 UK,那么我想加载 UKsize1=[NSArray arrayWithObjects :@"1",@"2",@"3",@"4",@"5", nil];在第二个组件中,如果用户在第一个组件中选择了美国,那么我希望 EUsize2=[NSArray arrayWithObjects:@"11",@"22",@"33",@"44",@"55", nil]; 在第二个组件中加载。与欧盟值相同,然后我想加载USsize3=[NSArray arrayWithObjects:@"111",@"222",@"333",@"444",@"555", nil];。我希望根据第一个组件更改第二个组件的值,第三个组件的值是固定的。

我试过这段代码,但我没有得到确切的值。

- (id)init 
{
    if (self = [super init]) {
        notesToDisplayForKey = [NSArray arrayWithObjects: @"UK", @"US", @"EU", nil];
        scaleNames = [NSArray arrayWithObjects: @"11", @"22", @"33", @"555",@"666",@"777",nil];
        scaleValue=[NSArray arrayWithObjects: @"1" ,@"2", @"3", @"4",@"5",@"6", @"7",@"8",@"9", @"10",@"11",nil];
        UKsize1=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
        EUsize2=[NSArray arrayWithObjects:@"11",@"22",@"33",@"44",@"55", nil];
        USsize3=[NSArray arrayWithObjects:@"111",@"222",@"333",@"444",@"555", nil];
    }
    return self;
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
    return 3;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{ 
    // Returns
    switch (component) {
        case 0: return [notesToDisplayForKey count];
        case 1:
            if([selectedKey isEqualToString:@"UK" ])
            {

                return [UKsize1 count];
            }
            else if([selectedKey isEqualToString:@"US"] )
            {

                return [USsize3 count];
            }
            else
            {

                return [EUsize2 count];
            }
            //return [scaleNames count];
        case 2: return [scaleValue count];
        default:break;
    }
    return 0;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    switch (component) {
        case 0: return [notesToDisplayForKey objectAtIndex:row];
        case 1:if([selectedKey isEqualToString:@"UK" ])
        {
            selectedScale = [scaleNames objectAtIndex:row];
            return selectedScale;
        }
        else if([selectedKey isEqualToString:@"US"] )
        {
            selectedScale = [USsize3 objectAtIndex:row];
            return selectedScale;
        }
        else
        {
            selectedScale = [EUsize2 objectAtIndex:row];
            return selectedScale;
        }
        case 2: return [scaleValue objectAtIndex:row];
        default:break;
    }
    return nil;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
  //  NSLog(@"Row %i selected in component %i", row, component);
    switch (component) {
        case 0:
            selectedKey = [notesToDisplayForKey objectAtIndex:row];
            return;

        case 1:

           // selectedScale = [scaleNames objectAtIndex:row];
            if([selectedKey isEqualToString:@"UK" ])
                  {
                      selectedScale = [scaleNames objectAtIndex:row];
                      return;
                  }
                else if([selectedKey isEqualToString:@"US"] )
                 {
                 selectedScale = [USsize3 objectAtIndex:row];
                return;
                 }
                else
                {
                 selectedScale = [EUsize2 objectAtIndex:row];
                 return;
                }
            return;

        case 2:
            selectedValue = [scaleValue objectAtIndex:row];
            return;
        default:break;
    }
}

【问题讨论】:

  • 有什么问题?当您选择 EU 时,您不想要 11、22、33 ... 数组吗?这些是 EUsize2 数组中的值。
  • 我想如果欧盟 11、22、33,如果是英国,那么 UKsize1 数组值将会出现。 @rdelmar

标签: ios iphone objective-c uipickerview


【解决方案1】:

只需检查此方法即可。它会起作用。

 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
      //  NSLog(@"Row %i selected in component %i", row, component);
        switch (component) {
            case 0:
                selectedKey = [notesToDisplayForKey objectAtIndex:row];
                  [pickerView reloadAllComponents];
                return;

            case 1:

               // selectedScale = [scaleNames objectAtIndex:row];
                if([selectedKey isEqualToString:@"UK" ])
                      {
                          selectedScale = [UKsize1 objectAtIndex:row];
                          return;
                      }
                    else if([selectedKey isEqualToString:@"US"] )
                     {
                     selectedScale = [USsize3 objectAtIndex:row];
                    return;
                     }
                    else
                    {
                     selectedScale = [EUsize2 objectAtIndex:row];
                     return;
                    }
                return;

            case 2:
                selectedValue = [scaleValue objectAtIndex:row];
                return;
            default:break;
        }
    }

【讨论】:

    【解决方案2】:

    您似乎没有重新加载选择器....每次您需要更改选择器中的数据时,您都需要像 UITableView 一样重新加载选择器。

    // 重新加载整个视图或单个组件

    - (void)reloadAllComponents;
    - (void)reloadComponent:(NSInteger)component;
    

    【讨论】:

    • 如何重新加载选择器视图。以及在哪里调用重载方法@Red Devil
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多