Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当UISlider停止时如何激发方法?_Ios_Objective C_Uislider - Fatal编程技术网

Ios 当UISlider停止时如何激发方法?

Ios 当UISlider停止时如何激发方法?,ios,objective-c,uislider,Ios,Objective C,Uislider,我有一个UISlider,允许用户更改值。我希望UILabel随着滑块从左向右移动而不断更新 所以,我写了我的UISlider方法如下: - (IBAction)yearsSlider:(UISlider *)sender { self.yearsLabel = [NSString stringWithFormat:@"%.0f", sender.value]; } 这个很好用。当用户停止滑块时,我需要启动一个不同的方法 我考虑过使用NSTimer来实现这一点,因此重写了上面

我有一个UISlider,允许用户更改值。我希望UILabel随着滑块从左向右移动而不断更新

所以,我写了我的UISlider方法如下:

    - (IBAction)yearsSlider:(UISlider *)sender
{
    self.yearsLabel = [NSString stringWithFormat:@"%.0f", sender.value];

}
这个很好用。当用户停止滑块时,我需要启动一个不同的方法

我考虑过使用NSTimer来实现这一点,因此重写了上面的方法,如下所示:

     - (IBAction)yearsSlider:(UISlider *)sender
    {
        self.yearsLabel = [NSString stringWithFormat:@"%.0f", sender.value];

 if (!self.timer){
        self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(requestCalculation) userInfo:nil repeats:NO];] 
    }

    }
 [self.timer invalidate];
self.timer = nil;
然后,在requestCalculation方法中,我使计时器无效,并将其设置为nil=如下所示:

     - (IBAction)yearsSlider:(UISlider *)sender
    {
        self.yearsLabel = [NSString stringWithFormat:@"%.0f", sender.value];

 if (!self.timer){
        self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(requestCalculation) userInfo:nil repeats:NO];] 
    }

    }
 [self.timer invalidate];
self.timer = nil;
这会减慢速度,但在滑块移动时会调用该方法。这不是我想要的


我知道我可以使用self.mySlider.continuous=NO;这意味着,当用户将手指从滑块上提起时,目标方法只触发一次。问题是,当用户在滑块上左右滑动时,“我的UILabel”不会更新

当用户抬起手指时,您可以使用uicontrol事件UIControlEventTouchUpInside启动操作,可能您需要检查触摸取消和外部触摸

[self.mySlider addTarget:self action:@selector(_ended) forControlEvents: UIControlEventTouchUpInside];

你的想法是对的。但是你用错误的方法取消了计时器。您希望取消yearsSlider:方法中的上一个计时器,而不是requestCalculation方法

顺便说一句,两秒钟似乎是一个相当长的延迟检查。更小的可能更好

请勿使requestCalculation中的计时器无效。把它设为零

仅供参考-使用NSNumberFormatter将滑块值转换为用户显示的值。这样做将确保值的格式适合用户的区域设置。

设置self.mySlider.continuous=YES;,并在与UIControlEventValueChanged对应的方法中更新标签


然后,为事件UIControlEventTouchUpInside和UIControlEventTouchUpOutside添加一个具有不同选择器的方法,并在其中执行明显昂贵的计算。

为此使用计时器似乎是一种非常丑陋的黑客行为。@user3477950我同意,但这个答案解释了OP在尝试时的错误之处。你的答案和另一个答案可能是更好的解决方案。正如在评论中所说的,这非常有效。然而,我似乎可以做得更好。我会将此标记为已回答,因为它用提供的代码解决了问题,并感谢您提供的NSNumber提示@为什么?这个答案解决了OP的问题。这可能不是最好的解决方案,但这并不意味着答案是错误的。麦迪的答案解决了OP的问题,所以我认为你不应该投反对票。user3477950的解决方案是使用一个单独的动作绑定到内部润色,我认为这是一个更好的方法,但是Maddy确实帮助用户修复了他的代码,并回答了提出的问题。你能给我举个例子吗?@Tander什么例子?我已经告诉你所有必要的信息了。您需要使用UIControl的addTarget:selector:forControlEvents:method。谢谢您解决了这个问题。它确实以一种干净的方式解决了这个问题。所以我会投票。rmaddy的答案根据提供的代码解决了问题。谢谢,我同意用户3477950。由于滑块是UIControl对象,因此它们将自动触发内部事件以及值更改事件的润色操作。这比使用计时器更干净。顺便说一句,我建议您的价值观已经停止改变IBAction方法,即内部补漆和外部补漆。否则,如果用户在拖动滑块时将手指拖离屏幕,您将不会得到通知。@Duncac您说得对,我也添加了该控件事件,谢谢您的建议。