【问题标题】:Why isn't the UIPickerView widthForComponent delegate method called everytime the view appears?为什么每次视图出现时都不调用 UIPickerView widthForComponent 委托方法?
【发布时间】:2009-10-26 02:27:39
【问题描述】:

我在 iPhone 屏幕上有两个控件 - 一个 TableView 和一个 UIPickerView。当您在 TableView 中选择单个单元格时,您将被带到另一个屏幕,您将在其中显示服装类型列表。从列表中选择单个服装项目会将您带回第一个屏幕。根据您的选择,UIPickerView 中的组件数量会发生变化 (1-4),并且每个组件都会填充相关数据。

假设你的服装类型列表中有三个项目,每个项目在被选中时应该在 UIPickerView 中有一定数量的组件:

皮带 - 3 个组件,宽度分别为 100、55、100 胸罩 - 3 个组件,宽度分别为 55、55、55 其他 - 宽度为 100、100、55、50 的 4 个组件

场景 #1 - 一切都应该是这样的

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

1.2 - 您选择“Other”服装项目,UIPickerView 由 4 个组件绘制,每个组件中都有相应的 Other 数据。组件宽度为 100、100、55、50。

1.3 - 您选择“胸罩”服装项目,UIPickerView 由 3 个组件绘制,每个组件中都有适当的胸罩数据。组件宽度为 55、55、55。

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

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

1.2 - 您选择“胸罩”服装项目,UIPickerView 由 3 个组件绘制,每个组件中都有适当的胸罩数据。但是,组件宽度仍然是 100、55、100,而不是 55、55、55。

1.3 - 您选择“Other”服装项目,UIPickerView 由 4 个组件绘制,每个组件中都有适当的 Other 数据。组件宽度为 100、100、55、50。

1.2 - 您选择“胸罩”服装项目,UIPickerView 由 3 个组件绘制,每个组件中都有适当的胸罩数据。组件宽度现在是正确的 - 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];

 ...

}

提前致谢。

【问题讨论】:

    标签: iphone delegates uipickerview


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      实际上,只使用 setNeedsLayout 也可以,而且可能会更简洁一些。

      [picker reloadAllComponents];
      [picker setNeedsLayout];
      

      【讨论】:

      • 这应该是答案,完美运行,无需解决方法,
      【解决方案3】:

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

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

      numberOdComponents 方法返回 currentNumberOfComponents

      【讨论】:

      • 我已经在这样做了(参见上面的代码示例)。只有当 UIPickerView 中的组件数量发生变化时,才会调用 widthForComponent 委托方法。
      • 嗯。我刚刚尝试在按下按钮时实现更改组件数量,它工作正常... onBtnPlusComponent 的代码在我的帖子中。
      猜你喜欢
      • 2017-05-17
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多