我有一个IBAction,按下按钮时,它会创建一个未安排的计时器。然后,如果相同的计时器已经启动,//执行某些操作,否则启动创建的计时器。 以下是我到目前为止的情况:
- (IBAction)button1Press {
NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn];
[inv setTarget: self];
[inv setSelector:@selector(onTick:)];
NSTimer *tapTimer = [NSTimer timerWithTimeInterval: 1.0
invocation:inv
repeats:NO];
if (/*tapTimer is running*/) {//do something
}else{
NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer: tapTimer forMode: NSDefaultRunLoopMode];
}
}
我的问题是如何作为条件。如果我把tapTimer isValid或!= nil然后它总是返回true,因为tapTimer已经被声明了。我不想让计时器无效或无效,因为按钮的主要目的是仅如果在1秒的时间间隔内按两次按钮,则执行操作。
如果有一种完全不同的方法来做我想做的事情那么请告诉我们!
感谢加载!
答案 0 :(得分:2)
据我所知,到目前为止,我发现您正在尝试检查tapTimer是否正在运行。我有一个建议。使用变量来指示您是否正在运行tapTimer。运行计时器时,将此变量更改为true,当计时器的时间到达0并调用您选择的方法时,在此方法中将此变量更改为false。
这有帮助吗?
答案 1 :(得分:0)
我建议使用零检查确定您的计时器是否正在运行。
...
//Define _tapTimer in .h
if (_tapTimer) {//do something
}
else{
_tapTimer = [[NSTimer timerWithTimeInterval: 1.0
invocation:inv
repeats:NO] retain];
NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer: _tapTimer forMode: NSDefaultRunLoopMode];
}
...
-(void)timerFired:(NSTimer*)timer
{
if(timer == _tapTimer)
{
//Handle timerfired
[_tapTimer release], _tapTimer = nil;
}
}
答案 2 :(得分:-1)
您可以查询RunLoop以了解循环中是否有这样的计时器
CFRunLoopRef loopRef = [[runner currentRunLoop] getCFRunLoop];
Boolean timerAdded = CFRunLoopContainsTimer(loopRef, (CFRunLoopTimerRef)timer ,kCFRunLoopDefaultMode)
if (timerAdded)
{
...
}
但是,我还没有测试过那段代码