我创建了一个包含两个组件的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];

在调用此代码后,我尝试打印出以下内容,似乎打印出了正确的值,但是当选择器仅显示组件(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]);

有没有人对如何调试这个或什么问题有什么想法?
更新
- (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;
}

最佳答案

UpIKEVIEW奇怪的怪癖之一是当你打电话时

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

这将触发对代理的
[pickerView: didSelectRow: inComponent: ]

因此,很容易创建意外的争用条件,因此请检查委托的pickerview:didselectrow:in component:method,并注意,由于设置了第一个组件,此操作将在中间调用。最好为component0中选择的内容存储一个变量并关闭它,而不是关闭picker中选择的内容。你也可以考虑存储一个布尔值(listentopicker),这样你就可以把didselect放在if(listentopicker){…..},然后在使用selectRow:animated:calls设置它之前,可以将listentopicker设置为no,在viewDidAppear中设置完所有组件后将其恢复为yes。祝你好运

10-08 05:44