3

2 つのコンポーネントを持つを作成しましたUIPickerView。最初のコンポーネント (A) の行数は 13 に固定されています。もう 1 つのコンポーネント (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;
}
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 に答える