除非我禁用自动调整大小子视图,否则UIPickerView会错误地显示值

时间:2014-02-19 17:50:48

标签: ios objective-c uipickerview modalviewcontroller

我有一个模态视图,它有两个选择器,一个日期选择器和一个带有类别和子类别的内容的双组件选择器

我根据第一个组件中选择的内容动态设置类别/子类别选择器的内容,以驱动第二个组件的内容。

当我将模态视图加载为新的模态视图并将所有内容设置为默认值时,它可以正常工作。显示今天的日期,类别/子类别选择器的第0行显示出来。如果我更改了值并退出模态视图,一切都很好,我在父视图中正确存储了选择器中的值。

我的挑战是当我加载具有特定值的模态视图以反映选择时。假设我在2014年2月18日完成了一项交易,该类别为“运输”,子类别为“培训”。

日期选择器显示正确的值,但如果选择是数组中的最后一个条目,则category / subcategory显示的值不正确。

让我说明一下:

说我的类别是: 餐饮,娱乐,杂货,杂项,交通

对于运输的子类别: 巴士,天然气,地铁,出租车,火车

如果我使用娱乐和音乐初始化选择器它看起来很好,但如果我使用Tranportation和Train初始化它,选择器显示杂项和出租车,因为运输和火车是阵列的最后一个元素。如果我用Transportation和Gas初始化它,它会显示为Miscellaneous and Gas。如您所见,运输总是显示为Miscallaneous,因为运输是阵列中的最后一个条目。

enter image description here enter image description here

为了简化我的问题,我简化了代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (self.dateCreated) {
        [self.datePicker setDate:self.dateCreated];
    }

    self.categoryArray  = [[NSArray alloc]         initWithObjects:@"Dining",@"Entertainment",@"Groceries",@"Miscellaneious",@"Transportation",nil];
    self.subCategoryArray  = [[NSArray alloc]         initWithObjects:@"Bus",@"Gas",@"Subway",@"Taxi",@"Train", nil];

    self.selectedCategoryRow = 4;
    self.selectedSubCategoryRow = 4;

    [self.categoryPicker selectRow:4 inComponent:0 animated:YES];
    [self.categoryPicker selectRow:4 inComponent:1 animated:YES];
    [self.categoryPicker reloadAllComponents];  // NOT REALLY NEEDED
}

// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}

// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    int num = 0;
    if (0 == component) {
        num = [self.categoryArray count];
    } else if (1 == component) {
        num = [self.subCategoryArray count];
    } else {
        NSLog(@"Unknown component %d", component);
    }
    return num;
}

我发现修复它的唯一方法就是如果在选择器的故事板中我取消选中AutoresizeSubviews。此时,选择器显示正确的值,但它看起来如此严重:

enter image description here

我可以在代码中做些什么来解决这个问题吗?

供参考,以下是故事板中选择器的配置方式:

enter image description here enter image description here

为了解决这个问题,我在View do load中添加了这段代码:

self.categoryPicker.frame = CGRectMake(20, 332, 280, 216);

故事板中不需要更改自动调整大小的设置,因此我将其恢复。

如果这是黑客攻击,请告诉我。

2 个答案:

答案 0 :(得分:1)

在调用reloadAllComponents后,您应该初始化选定的行

[self.categoryPicker reloadAllComponents];
[self.categoryPicker selectRow:4 inComponent:0 animated:YES];
[self.categoryPicker selectRow:4 inComponent:1 animated:YES];

答案 1 :(得分:0)

要解决此问题,我在View do load中添加了此代码:

self.categoryPicker.frame = CGRectMake(20, 332, 280, 216);

故事板中不需要更改自动调整大小的设置,因此我将其恢复。