UIPickerView selectRow无法按预期工作 [英] UIPickerView selectRow not working as expected

查看:194
本文介绍了UIPickerView selectRow无法按预期工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I've created a UIPickerView which has two components, the first component (A) has a fixed number of rows set at 13. The other component (B) has a variable number of rows which is dependant on the row selected in (A).

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

When loading the UIPickerView I am calling the following so that I can default the selection in both components, however the issue Im having is that only component (A) shows the correct values. Component (B) doesn't show the correct set of rows or the correct selection.

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

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

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]);

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

Does anyone have any ideas on how to debug this or what the issue may be?

更新

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


推荐答案

其中一个奇怪的怪癖UIPickerView就是当你打电话时

One of the weird eccentricities of UIPickerView is that when you call

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

这将触发对代表的调用

[pickerView: didSelectRow: inComponent: ]

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

As a result of this it can be easy to create inadvertent race conditions, so check in your delegate's pickerView: didSelectRow: inComponent: method and be aware that this is being called in the middle here as a result of setting the first component. You might be better off storing a variable for what is selected in component0 and switching off that rather than off what is selected in the picker. You might also consider storing a boolean (listenToPicker) so you can switch it off temporally by putting the didSelect stuff inside a if (listenToPicker){ ..... }, then before setting it up with the selectRow: animated: calls you can set listenToPicker to NO, restoring it to YES after all components are set in viewDidAppear . Good luck

这篇关于UIPickerView selectRow无法按预期工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆