objective-c - 如何在运行时取消 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 以便我的取消按钮起作用?
谢谢!
解决方案
你需要类似的东西
self.timer = [NSTimer scheduledTimerWithTimeInterval:timersecondsval ...
开始和取消你需要
self.timer.invalidate;
编辑
根据评论 - 请记住,您需要ivar
在界面中为此计时器声明一个,例如
@interface MyClass ()
@property (nonatomic,strong) NSTimer * timer; // My timer
@end
您可以将其放置在标题或类文件中,具体取决于您是否希望其他类也可以访问它。
另外,请注意,对于 ARC,您通常将其声明为strong
.
推荐阅读
- java - 我无法让我的金字塔课程打印金字塔
- groovy - 如何使用 groovy 脚本查找和替换字符串
- python - 试图确定正确的 Python/Django 单元测试解决方案 - unittest vs pytest vs “manage.py test” vs ...?
- python - 如何从 R 或 Python 中的函数 image_line_segment_detector 获取数据
- javascript - 如何将类的所有用户定义的静态成员提取到对象中?
- python - 当我在我的 Windows 10 系统上为 python 3.8 使用命令 pip install keras 时,它向我显示以下错误,任何人都可以帮助我
- android - 在 Flutter 中发布 APK 崩溃
- azure - Azure 发布和查询值列表的最简单方法
- docker - 如何将域 CNAME 到“host.docker.internal”?
- regex - 如果在找到某个字符后存在后续字符,则正则表达式不匹配