如何取消 NSTimer,而它是 运行? (Objective C)

How can I cancel an NSTimer while it is running? (Objective C)

我有一个带有 NSTimer 的非常简单的计时器应用程序。我设置了一个取消按钮,但我不确定如何让它工作。

这是我的计时器代码。当用户按下开始按钮(未显示)时触发。

    -(void) timerFunction{
    NSString *timerSeconds = _timerSecondsField.text;
    NSString *doubleconversion = timerSeconds;
    double  timersecondsval = [doubleconversion doubleValue];
    self.cancelVisibility.hidden = NO; 
    self.timerSecondsField.hidden = YES; 
    self.restartTimerVisibility.hidden = YES;
    self.timerStatus.hidden= NO;
    self.timerStatus.text = (@"Timer Running");
       
    [NSTimer scheduledTimerWithTimeInterval:timersecondsval target:self selector:@selector(timerStatusUpdater) userInfo: nil repeats:NO];
    

}

基本上我想要取消按钮来停止计时器并重置视图。我尝试使用 if 语句将“timersecondsval”更改为 0 并使“timerStatusUpdater”调用我的视图重置函数而不是调用播放警报声音的函数,但更改时间不起作用所以我必须等待直到计时器结束以重置视图。 (并且视图重置使我的应用程序崩溃了)。

这里是视图重置的代码:

-(void) newView{
    self.cancelVisibility.hidden = YES;
    self.timerStatus.hidden = YES;
    self.restartTimerVisibility.hidden = YES;
    self.timerSecondsField.hidden = NO;
    
}

我也试过像这样使用取消函数来调用一个新的NSTimer,但它并没有取消之前的函数。这是它的代码:

- (IBAction)cancelPressed:(id)sender {
    
     [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(newView) userInfo: nil repeats:NO];
    
    
}

那么我可以添加一个函数来取消之前的 NSTimer 以便我的取消按钮起作用吗?

谢谢!

你需要这样的东西

self.timer = [NSTimer scheduledTimerWithTimeInterval:timersecondsval ...

开始和取消你需要

self.timer.invalidate;

编辑

根据评论 - 请记住,您需要在界面中为此计时器声明 ivar,例如

@interface MyClass ()

@property (nonatomic,strong) NSTimer * timer; // My timer

@end

您可以将其放在 header 或 class 文件中,具体取决于您是否希望其他 class 也可以访问它。

此外,请注意,对于 ARC,您通常将其声明为 strong