具有多个组件的 UIPickerView/基于组件 1 和 2 选择的第 3 个组件项

UIPickerView with multiple components / 3rd component items based on component 1 and 2 selection

我刚刚创建了一个包含三个组件的 UIPickerView。轮子 1 和 2 中的用户 selects 数字和基于这些 select 离子它将显示 wheel/component 3 中两个可能的数组之一。我已经让它工作得很好一个例外:

问题: 为了根据组件 1 和组件 2 的 selection 更新第三个组件,用户必须通过移动选择器轮实际 select 一个项目。但可能存在用户想要使用默认 selection 的情况(在我的例子中,组件 1 和 2 中的 NSString“0”)并且不接触那些轮子。因此组件 3 将不会更新。

知道如何解决这个问题吗?有没有一种方法可以在用户 selects 之前更新 UIPickerView 第三个组件中的项目,以欺骗组件 1 和 2 中的默认 selection 作为实际 select离子而不让用户实际移动那些轮子?

或者让我们以这种方式提出问题:我可以自动 select 编辑 UIPickerView 的默认行,而不用手指 select 编辑特定行吗?

对我试图完成的事情的补充说明: 当用户单击文本字段时,将打开一个包含三列的 UIPickerView。在第一个轮子中,用户 select 是一个介于 0 和 16 之间的数字,在第二个轮子中,他将 select 一个分数,在第三个轮子中,他将是一个测量单位。例如: 1 1/2 杯, 1 盎司, 1/2 杯, 等等 根据数字和分数 selection,第三个选择器轮中的单位名称将以单数或复数拼写显示(1 杯对 2 杯)。只要触摸前两个轮子并完成物理 selection,整个事情就会完美地进行。问题:让我们以用户想要 select “1 盎司”为例。他会将第一个轮子移动到 1,将第二个轮子单独放置(因为它已经定位在 0 上),然后选择 "ounces"。但是使用我的代码,第三个轮子不会更新为单数拼写。只有,如果我真的移动第二个轮子并回到0。然后第三个轮子立即改变。

谢谢!!

这是我目前的代码:

    _countPickerData = @[@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"12", @"13", @"14", @"15", @"16"];
        _fractionPickerData = @[@"0", @"1/2", @"1/4", @"1/8", @"3/4", @"3/8", @"5/8", @"7/8"];
        _singularUnitPickerData = @[@"NONE", @"ounce", @"cup", @"pound"];
        _pluralUnitPickerData = @[@"NONE", @"ounces", @"cups", @"pounds"];

// The number of columns of data
    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    {
        return 3;
    }

    // The number of rows of data
    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
    {
        switch (component) {
            case 0: return [_countPickerData count];
            case 1: return [_fractionPickerData count];
            case 2:
                 if (([countHelper isEqualToString:@"1"] && [countFractionHelper isEqualToString:@"0"]) || ([countHelper isEqualToString:@"0"] && ([countFractionHelper isEqualToString:@"1/2" ] || [countFractionHelper isEqualToString:@"1/4"] || [countFractionHelper isEqualToString:@"1/8"])))
                {
                    return [_singularUnitPickerData count];
                }
                else
                {
                    return [_pluralUnitPickerData count];
                }
        }
        return 0;
    }

    // The data to return for the row and component (column) that's being passed in
    - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
        switch (component)
        {
            case 0: return [_countPickerData objectAtIndex:row];
            case 1: return [_fractionPickerData objectAtIndex:row];
            case 2:
                if (([countHelper isEqualToString:@"1"] && [countFractionHelper isEqualToString:@"0"]) || ([countHelper isEqualToString:@"0"] && ([countFractionHelper isEqualToString:@"1/2" ] || [countFractionHelper isEqualToString:@"1/4"] || [countFractionHelper isEqualToString:@"1/8"])))
                {
                    pickedUnitHelper = [_singularUnitPickerData objectAtIndex:row];
                    return pickedUnitHelper;
                }
                else
                {
                    pickedUnitHelper = [_pluralUnitPickerData objectAtIndex:row];
                    return pickedUnitHelper;
                }
            default:break;
        }return nil;
    }

    // Preparing pickerView selection for textFieldIngredientUnit
    NSInteger selectedRowUnit;
    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        switch (component)
        {
            case 0:
                countHelper = [_countPickerData objectAtIndex:row];
                return;

            case 1:
                countFractionHelper = [_fractionPickerData objectAtIndex:row];
                return;

            case 2:
                if (([countHelper isEqualToString:@"1"] && [countFractionHelper isEqualToString:@"0"]) || ([countHelper isEqualToString:@"0"] && ([countFractionHelper isEqualToString:@"1/2" ] || [countFractionHelper isEqualToString:@"1/4"] || [countFractionHelper isEqualToString:@"1/8"])))
                {
                    pickedUnitHelper = [_singularUnitPickerData objectAtIndex:row];
                    return;

                }
                else
                {
                    pickedUnitHelper = [_pluralUnitPickerData objectAtIndex:row];
                    return;

                }
            default:break;
        }
    }

是的,您可以自动 select 选择器的一行,而无需用手指触摸它。例如:

[self.pickerView selectRow:0 inComponent:2 animated:YES];

在视图出现在屏幕上之前调用它。大概在 viewWillAppear:

更新:

Markus 和我通过聊天检查了这个问题,然后我想出了一个解决方案。基本上,任何时候:

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

被调用,如果它是组件 0 或 1,我们需要重新加载组件 2。我们这样做(在 didSelectRow 方法中)通过说:

[pickerView reloadComponent:2];

他的代码中还有其他一些小问题无法正常工作,但就此堆栈溢出问题而言,这就是所有需要解释的内容。

我最近遇到了同样的问题(uipickerview 没有 select 第一个值)。我试过..

[_myPicker selectRow:0 in Component:0 animated:YES];

但这仍然没有 select 值,它将选择器转到我在 select 行和组件中选择的任何内容,但没有将该值发送到任何地方。所以我所做的是在我的选择器数组中创建一个额外的行。我的选择器值为 1、2、3 和 4。所以当我添加数组时,它看起来像这样..

_myPickerArray = [[NSArray alloc] initWithObjects:@" ", @"1", @"2", @"3", @"4", nil];

现在用户必须将滚轮转到 select 某处。在您的代码中,您正在检查输入是否为 1 的字符串。如果它们 select space,则不会满足该条件。看看是否可行。