每当我完成我的NSTimer时,我想让它失效并创建一个新的间隔,但它保持旧的间隔以及新的间隔。单击offButton后,我想使NSTimes无效。计时器停止打印“工作”但是当我用不同的间隔调用我的方法时,它会为两个间隔打印“工作”。
我的代码是这样的:
-(void) fireTimer{
NSString *textValue = [sliderLabel text];
float value = [textValue floatValue];
[NSTimer scheduledTimerWithTimeInterval:value target:self selector:@selector(vibrate:) userInfo:nil repeats:YES];
}
- (void) vibrate:(NSTimer*)timer {
if(_offButton.selected){
[timer invalidate];
timer=nil;
}
NSLog(@"Working");
}
答案 0 :(得分:3)
您不是通过直接从UITextField
获取值来遵循MVC设计模式。这些值应存储在模型对象中,MVC模式用于从文本字段中获取任何新值到模型中。您当前的实施非常精细,并且会在最轻微的微风中打破。它还要求此代码可以访问UI元素,这非常不灵活;最好让它只访问模型对象。
将NSTimer *
存储为实例变量,请注意,如果您使用ARC,则NSTimer
会保留目标(!!),因此请将此设置为实例变量__weak
打破保留周期。
如果您希望计时器重复,则根本不需要重置计时器;只有在用户更改时间时才需要这样做(参见第1点!)。
将if (button_selected) do_vibrate;
代码移至计时器触发方法。
答案 1 :(得分:1)
您自己使用的失效代码是正确的。但是你可以更容易地将你的计时器作为ivar或财产引用。
在这种情况下,你肯定会避免制作一个计时器的多个实例。