UIPickerView selectRow无法按预期工作

The*_*imp 3 objective-c uipickerview uipickerviewdatasource ios8

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

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

[picker selectRow:rowA inComponent:COMPONENT_A animated:YES];
[picker reloadAllComponents];
[picker selectRow:rowB inComponent:COMPONENT_B animated:YES];
Run Code Online (Sandbox Code Playgroud)

我试过在调用此代码后打印以下内容,似乎已打印出正确的值,但是当选择器仅显示组件(A)时,将显示正确的值和选择。

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]);
Run Code Online (Sandbox Code Playgroud)

是否有人对如何调试此问题或问题可能有什么想法?

更新资料

- (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;
}
Run Code Online (Sandbox Code Playgroud)

sta*_*Man 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];
}
Run Code Online (Sandbox Code Playgroud)

另外,您做的地方:

NSInteger selectedRowIdx = [self selectedRowInComponent:COMPONENT_A];
Run Code Online (Sandbox Code Playgroud)

不应该是

NSInteger selectedRowIdx = [pickerView selectedRowInComponent:COMPONENT_A];
Run Code Online (Sandbox Code Playgroud)