我创建了一个包含一个选择器的ViewController。触发它的视图出现并使用四个数据阵列之一填充选择器,具体取决于在superview中按下了四个按钮中的哪一个。我给了子视图一个名为int
的{{1}}属性,然后我在按钮代码中设置了它,如下所示:
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;
}
}
设置为新值,我的子视图也无法识别该值已更改。基本上,无论我按哪个按钮,它都会显示一个填充了我按下的第一个按钮对应数据的选择器。更复杂的是,superview是Master-Detail模板中的Detail视图。
pickerView
属性是这样创建的:
pickerType
我正在使用ARC。我不知道这对我来说是一个愚蠢的编程错误,还是与视图的生命周期有关。
答案 0 :(得分: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];
}
答案 1 :(得分:0)
如果pickerView
不是nil,那么你所做的就是让它的视图成为当前控制器的子视图(如果没有其他代码删除它,它就已经存在),而不更改属性。
答案 2 :(得分:-1)
在分配新类型后尝试调用[pickerView reloadAllComponents];