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

时间:2015-03-31 15:45:20

标签: objective-c xcode uipickerview

我刚创建了一个包含三个组件的UIPickerView。用户选择第1轮和第2轮中的数字,并根据这些选择,它将显示方向盘/组件3中两个可能的数组之一。我已经让它工作正常,但有一个例外:

问题: 为了基于组件1和2的选择更新第三组件,用户必须通过移动拾取轮实际上物理地选择项目。但是可能存在这样的情况:用户想要使用默认选择(在我的例子中是NSString" 0"在组件1和2中)并且不接触那些轮子。因此,组件3不会更新。

知道如何解决这个问题吗?有没有办法在用户选择第三个组件中的项目之前更新UIPickerView,以便将组件1和组件2中的默认选择作为实际选择而不用用户实际移动那些轮子?

或者让我们用这样的方式表达问题:我可以自动选择UIPickerView的默认行而不用手指选择特定行吗?

我试图完成的其他解释: 当用户在文本字段中单击时,将打开具有三列的UIPickerView。在第一个轮子中,用户选择0到16之间的数字,在第二个轮子中他将选择一个分数,在第三个轮子中选择一个测量单元。例如: 1 1/2杯, 1盎司, 1/2杯, 等等 根据数量和分数选择,第三个选取器轮中的单元名称将以单数或复数拼写显示(1杯对2杯)。只要触摸前两个轮子并进行物理选择,整个过程就能完美运行。问题:让我们举例说明用户想要选择" 1盎司"。他将第一个轮子移动到1,将第二个轮子单独移动(因为它已经定位在0上),然后选择"盎司"。但是使用我的代码,第三轮不会更新为单数拼写。只有,如果我实际上移动了第二个轮子并返回到0.然后第3个轮子立即改变。

谢谢!

这是我到目前为止的代码:

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

2 个答案:

答案 0 :(得分:1)

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

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

在视图出现在屏幕上之前调用此方法。可能在viewWillAppear:

更新:

马库斯和我通过聊天检查了这一点,我想出了一个解决方案。基本上,任何时候:

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

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

[pickerView reloadComponent:2];

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

答案 1 :(得分:0)

我最近遇到了同样的问题(uipickerview没有选择第一个值)。我试着做..

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

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

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

现在用户必须转动滚轮才能选择一些东西。在您的代码中,您正在检查输入是否为1的字符串。如果他们选择了空格,则不会满足该条件。看看是否有效。