我一直在成功使用NSTimer,但现在我遇到了麻烦。毫无疑问是一些愚蠢的事。欣赏另一双眼睛。运行调试器,我看到调用了applicationDidFinishLaunching,但是从不调用trigger。
-(void) trigger:(NSTimer *) theTimer{
NSLog(@"timer fired");
}
- (void)applicationDidFinishLaunching:(UIApplication *)application {
nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger) userInfo:nil repeats:YES];
[window makeKeyAndVisible];
}
答案 0 :(得分:13)
选择器必须具有以下签名:
- (void)timerFireMethod:(NSTimer*)theTimer
所以你需要
@selector(trigger:)
- 编辑 -
也许你正在其他地方这样做,但在你所包含的代码中,你实际上并没有启动计时器。您必须先将它添加到NSRunLoop才能触发任何事件。
[[NSRunLoop currentRunLoop] addTimer:nst forMode:NSDefaultRunLoopMode];
如果我正确阅读了这些例子。我只使用了自动将其添加到当前NSRunLoop的init方法。您真的应该查看我的帖子中的评论中包含的开发者文档。
答案 1 :(得分:2)
两件事:
1)正如其他人所说,该方法应具有以下签名..
-(void) trigger:(NSTimer *) theTimer;
然后你做了计时器:
nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger:) userInfo:nil repeats:YES];
2)仅创建计时器不会运行它。正如the documentation says:
您必须将新计时器添加到运行中 循环,使用addTimer:forMode:。然后, 经过几秒钟后,计时器 火灾,调用调用。 (如果 计时器配置为重复,那里 没有必要随后重新添加 计时器到运行循环。)
这是一段真实功能的代码,您可以在其后建模。计时器创建与您的相同,但它也以正确的方式将其添加到runloop。
[[NSRunLoop currentRunLoop] addTimer:
[NSTimer timerWithTimeInterval:0.1
target:self
selector:@selector(someSelector:)
userInfo:nil
repeats:NO]
forMode:NSDefaultRunLoopMode];
答案 2 :(得分:1)
您给定时器的选择器trigger
表示它应该调用不带参数的方法。将定时器触发的方法更改为
- (void)trigger
{
// look at me, I don't take any parameters
NSLog(@"timer fired");
}
或更改初始定时器调用以使用@selector(trigger:)
。
答案 3 :(得分:0)
你的问题是由于timerWithTimeInterval:target:selector:userInfo:repeats:
创建了一个计时器,但不在运行循环中安排它,你必须自己做。
但是,您也可以使用此方法创建计时器并在运行循环中对其进行计划:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
答案 4 :(得分:0)
我在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
中启动计时器而不是主线程时遇到问题。
dispatch_async(dispatch_get_main_queue(), ^{
[self startScheduledTimer];
});