如何取消 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
。
我有一个带有 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
。