提前感谢您的关注。 我试图在我的简单应用程序中实现一点动画效果,这次使用UIPickerView对象。
基本上,当某个事件发生时,我希望我的选择器视图动画自己选择它的最后一行(当然是动画)和紧接着(没有任何进一步的用户交互)第一行(当然是动画) 。这个,给我一个“应用程序变得疯狂”的效果,我想这应该是非常诙谐的。
因此我的代码是:
[myPicker selectRow:[myPicker numberOfRowsInComponent:0]-1 inComponent:0 animated:YES];
[myPicker selectRow: 0 inComponent:0 animated:YES];
我得到的是,无论在其中指定的行,选择器都只执行第二条指令。它似乎忽略了第一个。
我认为这可能是编译器的一些“聪明”功能,它注意到两个跟随指令执行对同一变量的赋值,因此最好忽略第一个(不考虑'ANIMATED'因子)。 我不知道是不是这样,但我试图在两个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];
它不起作用:选择器仍然只执行第二个动作,它只会移动一次。
现在的问题是:
为什么选择器只移动一次?
我如何达到目标(即使可能有点微不足道)?
答案 0 :(得分:2)
这与编译器无关。这不是那么聪明。
仅执行一个动画的原因是动画不会“一次”启动,而是在下一个运行循环中启动(更多关于哪个here)。此时,动画将使用发送给选择器的最新值开始。
使用performSelector:withObject:afterDelay:应该可以工作,并且它不起作用的原因可能是你将1作为两次调用的延迟。在第一个上设置为0,在第二个上设置为2(例如),它应该可以工作。