0

我创建了一个包含一个选择器的 ViewController。它的视图被触发以显示并使用四个数据数组之一填充选择器,具体取决于在超级视图中按下了四个按钮中的哪一个。我给子视图一个int名为 的属性pickerType,然后在按钮代码中设置它,如下所示:

    - (IBAction)chooseDepType:(id)sender
    {

        if (pickerView==nil)
        {
           pickerView = [[Picker alloc] initWithNibName:@"Picker" bundle:nil];
           //send message to next view telling which array to load in picker
           pickerView.pickerType=1;
        }
        [self.view addSubview:pickerView.view];
    }

其他按钮方法看起来相同,只是pickerType设置为不同的值。然后,在子视图中,我设置了数据源和委托方法,如下所示:

   -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
    {
        if(pickerType_ ==1)
        {
            // return the appropriate number of components, for instance
            return 1;
        }
    }

我遇到的问题是,即使我pickerView在每个按钮的代码中设置了一个新值,我的子视图也没有识别出该值已更改。基本上,无论我按下哪个按钮,它都会向我显示一个选择器,其中填充了与我按下的第一个按钮相对应的数据。使事情复杂化,也许,superview 是 Master-Detail 模板中的 Detail 视图。

pickerType属性是这样创建的:

    @property (assign) int pickerType;

    @synthesize pickerType=pickerType_;

我正在使用 ARC。我不知道这是否是我的一个愚蠢的编程错误,或者与视图的生命周期有关。

4

3 回答 3

1

由于您正在检查您的Picker是否已经创建:

if (pickerView==nil)

在设置类型之前:

    pickerView.pickerType=1;

下次按下按钮时,pickerView已经存在,执行会跳过的主体if并且类型不会改变。

要解决此问题,请将排版语句移出if块。

顺便说一句,如果你有四个按钮几乎都做同样的事情,你可以让它们都触发相同的动作,并通过它们的属性IBAction区分哪个按钮被按下:tag

- (IBAction)showPicker: (id)sender
{
    if (pickerView==nil)
    {
       pickerView = [[Picker alloc] initWithNibName:@"Picker" bundle:nil];
    }
    // Each button's tag could correspond exactly to the appropriate pickerType,
    // or have any other meaning you choose.
    [pickerView setPickerType:[sender tag]];
    [self.view addSubview:pickerView.view];
}
于 2012-10-05T18:15:21.703 回答
0

如果pickerView不是 nil,那么您所做的就是使其视图成为当前控制器的子视图(如果没有其他代码将其删除,则它已经是),而不更改属性。

于 2012-10-05T18:16:22.060 回答
-1

分配新类型后尝试调用 [pickerView reloadAllComponents];

于 2012-10-05T19:20:12.277 回答