我有当其触发定时器viewWillAppear
的方法被调用,当无效viewDidDisappear
被调用的方法。 但是一定量的它是无效的,甚至后,定时器继续射击视图之间切换后。 有什么问题?
这里是我的代码:
NSTimer *timer;
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f
target: self
selector:@selector( timerAction )
userInfo:nil
repeats:YES];
}
-(void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[timer invalidate];
timer = nil;
}
-(void) timerAction
{
NSLog(@"timerAction");
}
Answer 1:
我应该已经通过保留它保持一个链接到计时器。 :)我问这个问题,4个月前,它是惊人的,多少经验,我获得的。 :)
timer = [ [NSTimer scheduledTimerWithTimeInterval: ...] retain];
...
...
[timer invalidate];
[timer release];
Answer 2:
这是一个绝对的解决方案。 的那些都不以上为我工作,所以我这样做,
要启动计时器,
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:NO];
计时器调用的方法,
-(void)timerMethod
{
// do what you need to do
if (needs to be called again) {
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:NO];
}
}
希望这可以帮助,
Answer 3:
由计时器调用的方法应具备的定义
- (void)methodName:(NSTimer *)aTimer;
这样的方法有哪些被解雇计时器的实例。 你正在做的方式,该方法不会知道定时器是否被认定无效或没有。
试着改变你的定时器初始化
timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f target: self selector:@selector(timerAction:) userInfo:nil repeats:YES]
并且该方法以
-(void) timerAction:(NSTimer *)aTimer{...}
希望帮助
Answer 4:
这可能不是问题,但你需要保留提及是从scheduledTimerWithInterval返回计时器:。 如果不这样做,你的指针计时器可能是由你去阻止它的时间无效。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
timer = [[NSTimer scheduledTimerWithTimeInterval:0.2f target:self selector:@selector(timerAction) userInfo:nil repeats:YES] retain];
}
- (void)viewDidDisappear:(BOOL)animated
{
[timer invalidate];
[timer release];
timer = nil;
[super viewDidDisappear:animated];
}
- (void)dealloc
{
[timer invalidate];
[timer release];
timer = nil;
[super dealloc];
}
另外,尝试设置在viewDidDisappear一个断点,并确保它获取调用!
Answer 5:
**In .h class**
@interface
{
NSTimer * theTimer;
}
**in .m class**
//put this code where you want to calling the NSTimer function
theTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:) userInfo:nil repeats:YES];
- (void)updateCounter:(NSTimer *)theTimer
{
// write your code here for counter update
}
// put this code to Stop timer:
[theTimer invalidate];
theTimer = nil;
Answer 6:
这奏效了我在斯威夫特
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
dispatch_async(dispatch_get_main_queue(),{ [weak self] in
self?.idleTimer?.invalidate()
self?.idleTimer = nil
})
}
Answer 7:
你已经忘记释放定时器viewWillDisappear:
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[timer invalidate];
[timer release];
timer = nil;
}
这应该不会导致定时器虽然保持射击...
Answer 8:
的invalidate
的DOCO说
“运行循环中删除并释放定时器,要么只是该无效方法返回之前或在以后的某个点。”
我想你在以后的某个点得到清除。
Answer 9:
我有同样的问题。
我不能dealloc的我来说,如果计时器仍在运行,所以我打电话之前停止它:
- (void)stopTimer
{
[timer invalidate];
[timer release];
timer = nil;
}
调用此方法后我真的计时器停止
Answer 10:
- (void)viewWillAppear:(BOOL)animated
被再次调用。
事实上,它被调用每次切换视图或您关闭一个模式的看法后的时间。 基本上,你的观点实际上会重新出现在屏幕上的任何时候,不只是第一次。
因此,在这种情况下,定时器被重新启动,即使是之前无效。
Answer 11:
创建计时器后刚刚注册它在运行NSRunLoopCommonModes
:
[[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSRunLoopCommonModes];
然后, invalidate
的方法会奏效。
Answer 12:
这对我的作品
dispatch_async(dispatch_get_main_queue(), ^{
[timer invalidate];
});
文章来源: NSTimer doesn't stop