首页 > 解决方案 > 如何在运行时取消 NSTimer?(目标 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 以便我的取消按钮起作用?

谢谢!

标签: objective-cnstimer

解决方案


你需要类似的东西

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

开始和取消你需要

self.timer.invalidate;

编辑

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

@interface MyClass ()

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

@end

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

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


推荐阅读