为什么每次出现视图时都不会调用UIPickerView widthForComponent委托方法?

时间:2009-10-26 02:27:40

标签: iphone delegates uipickerview

我在iPhone屏幕上有两个控件 - 一个TableView和一个UIPickerView。当您在TableView中选择单个单元格时,您将进入另一个显示服装类型列表的屏幕。从列表中选择单个服装项将带您返回第一个屏幕。根据您的选择,更改UIPickerView中的组件数(1-4),并使用相关数据填充每个组件。

假设您在服装类型列表中有三个项目,并且每个项目在选择时都应在UIPickerView中具有一定数量的组件:

皮带 - 3个组件,宽度为100,55,100 Brassiere - 3个组件,宽度为55,55,55 其他 - 4个组件,宽度为100,100,55,50

场景#1 - 一切都应该是

1.1 - 您选择“Belt”服装项目,UIPickerView使用3个组件绘制,每个组件中都有相应的Belt数据。组件宽度为100,55,100。

1.2 - 您选择“其他”服装项目,UIPickerView使用4个组件绘制,每个组件中包含相应的其他数据。组件宽度为100,100,55,50。

1.3 - 您选择“Brassiere”服装项目,UIPickerView使用3个组件绘制,每个组件中都有相应的Brassiere数据。组件宽度为55,55,55。

场景#2 - 未重新绘制组件宽度

1.1 - 您选择“Belt”服装项目,UIPickerView使用3个组件绘制,每个组件中都有相应的Belt数据。组件宽度为100,55,100。

1.2 - 您选择“Brassiere”服装项目,UIPickerView使用3个组件绘制,每个组件中都有相应的Brassiere数据。但是,组件宽度仍然是100,55,100,而不是55,55,55。

1.3 - 您选择“其他”服装项目,UIPickerView使用4个组件绘制,每个组件中包含相应的其他数据。组件宽度为100,100,55,50。

1.2 - 您选择“Brassiere”服装项目,UIPickerView使用3个组件绘制,每个组件中都有相应的Brassiere数据。组件宽度现在是正确的--55,55,55。

从单步执行代码看起来UIPickerView widthForComponent委托方法只有在UIPickerView中的组件数发生变化时才会被调用。

有没有办法强制每次触发此委托方法?

更新 - 10.26.09

我使用以下代码在viewWillAppear委托中调用[UIPickerView reloadAllComponents:

-(void)viewWillAppear:(BOOL)animated {

 ...

 self.PopulatePickerArrays; // Populate components based on selection
 [sizePicker reloadAllComponents];

 ...

}

提前致谢。

3 个答案:

答案 0 :(得分:7)

事实证明,如果重置选择器的委托,则每次进行选择时都会重新绘制组件宽度。修改后的代码如下所示:

-(void)viewWillAppear:(BOOL)animated {

 ....

 self.PopulatePickerArray; // Populate components based on selection

 sizePicker.delegate = nil; // NEW CODE
 sizePicker.delegate = self; // NEW CODE

 [picker reloadAllComponents];

}

在此网页上找到信息 - Changing-Width-UIPicker-Continually

答案 1 :(得分:6)

实际上,只使用setNeedsLayout也可以工作,可能会更清洁。

[picker reloadAllComponents];
[picker setNeedsLayout];

答案 2 :(得分:0)

我不确定,但您可以尝试在viewWillAppear方法中调用[pickerView reloadAllComponents];

  if(currentNumbersOfComponents < 4){
    currentNumbersOfComponents++;
    [picker reloadAllComponents];
}

numberOdComponents方法返回currentNumberOfComponents