3

我创建了一个UIPickerView包含两个组件的组件,第一个组件 (A) 的固定行数设置为 13。另一个组件 (B) 的行数可变,取决于 (A) 中选择的行。

加载时,UIPickerView我正在调用以下命令,以便我可以在两个组件中默认选择,但是我遇到的问题是只有组件 (A) 显示正确的值。组件 (B) 未显示正确的行集或正确的选择。

[picker selectRow:rowA inComponent:COMPONENT_A animated:YES];
[picker reloadAllComponents];
[picker selectRow:rowB inComponent:COMPONENT_B animated:YES];

I have tried printing out the following after calling this code and it seems that the correct values are printed out, yet when the picker shows only component (A) is showing the correct values and selection.

NSLog(@"(A) - row selected: %i", [picker selectedRowInComponent:COMPONENT_A]);
NSLog(@"(A) - number of rows: %i", [picker numberOfRowsInComponent:COMPONENT_A]);

NSLog(@"(B) - row selected: %i", [picker selectedRowInComponent:COMPONENT_B]);
NSLog(@"(B) - number of rows: %i", [picker numberOfRowsInComponent:COMPONENT_B]);

有没有人对如何调试这个或问题可能有任何想法?

更新

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    switch (component) {
        case COMPONENT_A:
        {
            return 13;
        }
        case COMPONENT_B:
        {
            NSInteger selectedRowIdx = [picker selectedRowInComponent:COMPONENT_A];

            switch (selectedRowIdx) {
                case A:   return 2;
                case B:   return 4;
                case C:   return 6;
                case D:   return 8;
                case E:   return 10;
                case F:   return 12;
                case G:   return 14;
                case H:   return 16;
                case I:   return 18;
                case J:   return 20;
                case K:   return 22;
                case L:   return 24;
                default:    return 1;
            }
        }
    }

    return -1;
}


#pragma mark UIPickerViewDelegate

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    switch (component) {
        case COMPONENT_A:
        {
            switch (row) {
                case A:   return @"A";
                case B:   return @"B";
                case C:   return @"C";
                case D:   return @"D";
                case E:   return @"E";
                case F:   return @"F";
                case G:   return @"G";
                case H:   return @"H";
                case I:   return @"I";
                case J:   return @"J";
                case K:   return @"K";
                case L:   return @"L";
                default:    return @"";
            }
        }
        case COMPONENT_B:
        {
            if (row == 0) {
                return @"";
            } else {
                return [NSString stringWithFormat:@"%i", (int)row];
            }
        }
    }

    return nil;
}
4

3 回答 3

5

pickerView似乎没有时间正常呼吸,所以我建议你让正常viewDidLoad加载pickerView,然后做你的东西-viewDidAppear:

嗯......animated:YES无论如何你都想要这样,再一次,没有必要这样做-viewDidLoad甚至-viewWillAppear

尝试这个:

-(void)viewDidAppear:(BOOL)animated
{
    [picker selectRow:rowA inComponent:COMPONENT_A animated:YES];

    //no point reloading all components, just B
    [picker reloadComponent:COMPONENT_B];

    [picker selectRow:rowB inComponent:COMPONENT_B animated:YES];
}

另外,你做的地方:

NSInteger selectedRowIdx = [self selectedRowInComponent:COMPONENT_A];

那不应该

NSInteger selectedRowIdx = [pickerView selectedRowInComponent:COMPONENT_A];
于 2014-09-14T12:39:34.337 回答
1

UIPickerView 的一个奇怪的怪癖是当你调用

`[.. selectRow: inComponent: animated: ]`

这将触发对代表的调用

[pickerView: didSelectRow: inComponent: ]

因此,很容易创建无意的竞争条件,因此请检查您的委托的pickerView: didSelectRow: inComponent:方法,并注意这是在中间调用的,因为设置了第一个组件。您最好为 component0 中选择的内容存储一个变量并关闭它,而不是关闭选择器中选择的内容。您也可以考虑存储一个布尔值 (listenToPicker),以便您可以通过将 didSelect 内容放在if (listenToPicker){ ..... }中暂时关闭它,然后在使用 selectRow: animated: 调用之前将其关闭将listenToPicker设置为 NO,在viewDidAppear中设置所有组件后将其恢复为 YES 。祝你好运

于 2014-09-14T13:26:58.823 回答
0

这可能是一个迟到的答案,但我刚刚遇到了这个问题并通过以下方式解决了它

  1. func pickerView(_:didSelectRow:inComponent)您的view controller.

  2. 依次调用以下两个函数。

    2.1pickerView.selectRow(selectedIndex, inComponent: 0, animated: true)

    2.2.yourViewController.pickerView(pickerView, didSelectRow: selectedIndex, inComponent: 0)

于 2017-05-10T11:47:13.007 回答