懒惰的 UIPickerView - (它不会移动两次)

Posted

技术标签:

【中文标题】懒惰的 UIPickerView - (它不会移动两次)【英文标题】:Lazy UIPickerView - (it won't move twice) 【发布时间】:2010-02-19 11:50:50 【问题描述】:

提前感谢您的关注。 我试图在我的简单应用程序中实现一点动画效果,这次使用的是 UIPickerView 对象。

基本上,当某个事件发生时,我希望我的选择器视图能够动画自己选择它的最后一行(当然有动画),然后立即(没有任何进一步的用户交互)它的第一行(当然有动画) .我猜这是为了给出一个“应用程序变得疯狂”的效果,这应该是非常机智的。

因此我的代码是:

[myPicker selectRow:[myPicker numberOfRowsInComponent:0]-1 inComponent:0 animated:YES];
[myPicker selectRow: 0 inComponent:0 animated:YES];

我得到的是选择器将只执行第二条指令,无论其中指定的行如何。好像忽略了第一个。

我认为这可能是编译器的一些“聪明”功能,它指出以下两条指令执行对同一个变量的赋值,因此最好忽略第一个(不考虑“动画”因素)。 我不知道是否是这种情况,但我试图根据某个参数的值在两个 if 语句中移动这两条指令,试图以这种方式愚弄编译器(它在编译时无法知道该参数的值,因此它不应该执行这样的优化)。 它不起作用,要么是因为我完全没有踪迹,要么是因为编译器比我聪明得多。 我什至认为这可能是延迟和正确事件顺序的问题,因此我尝试如下重写代码

-(void) setPickerRowToLastRow;
 
     [myPicker selectRow:[myPicker numberOfRowsInComponent:0]-1 inComponent:0 animated:YES];
 
 -(void) setPickerRowToFirstRow;

    [myPicker selectRow:0 inComponent:0 animated:YES];

                      .....
[self performSelector: @selector(setPickerRowToLastRow)
                     withObject: nil
                     afterDelay: 1];
[self performSelector: @selector(setPickerRowToFirstRow)
               withObject: nil
               afterDelay: 1];

它不起作用:选择器仍然只执行第二个动作,它只会移动一次。

现在是问题:

为什么选择器只移动一次?

我怎样才能达到我的目标(即使可能有点微不足道)?

【问题讨论】:

【参考方案1】:

这与编译器无关。没那么聪明。

只执行一个动画的原因是动画不是“立即”开始,而是在下一个运行循环中开始(更多关于哪个here)。此时动画将使用发送到选取器的最新值开始。

使用 performSelector:withObject:afterDelay: 应该可以工作,但它不起作用的原因可能是您将 1 作为两个调用的延迟。将第一个设置为 0,第二个设置为 2(例如),它应该可以工作。

【讨论】:

我只是按照您所说的尝试并做,它有效(嗯..我离解决方案不远)。它似乎适用于任何几个延迟参数,其中第二个高于第一个。您的回答解决了我的问题,非常感谢。

以上是关于懒惰的 UIPickerView - (它不会移动两次)的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView 不会立即重绘未选中的行

UIPickerView - 循环数据

如何更改 UIPickerView 所说的内容?

UIPickerView 显示问题

检测 UIPickerView 何时开始更改/移动

UIPickerview 完成按钮不起作用,即使它没有调用选择器方法