NSTimer不调用方法

时间:2011-05-20 15:43:19

标签: objective-c cocoa nstimer

我现在真的很沮丧,谷歌搜索整个互联网,偶然发现了SO仍然没有找到解决方案。

我正在尝试实现NSTimer,但我定义的方法不会被调用。 (正确设置秒数,使用断点检查)。这是代码:

- (void) setTimerForAlarm:(Alarm *)alarm {
    NSTimeInterval seconds = [[alarm alarmDate] timeIntervalSinceNow];
    theTimer = [NSTimer timerWithTimeInterval:seconds 
                            target:self 
                          selector:@selector(showAlarm:)
                          userInfo:alarm repeats:NO];
}

- (void) showAlarm:(Alarm *)alarm {
    NSLog(@"Alarm: %@", [alarm alarmText]);
}

对象“theTimer”的定义是@property:

@interface FooAppDelegate : NSObject <NSApplicationDelegate, NSWindowDelegate>  {
@private

    NSTimer *theTimer;

}

@property (nonatomic, retain) NSTimer *theTimer;

- (void) setTimerForAlarm:(Alarm *)alarm;
- (void) showAlarm:(Alarm *)alarm;

我做错了什么?

5 个答案:

答案 0 :(得分:27)

timerWithTimeInterval只是创建一个计时器,但不会将其添加到任何运行循环中以供执行。尝试

self.theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
                        target:self 
                      selector:@selector(showAlarm:)
                      userInfo:alarm repeats:NO];

代替。

答案 1 :(得分:8)

也不要忘记检查是否

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds 
                                     target:(id)target 
                                   selector:(SEL)aSelector 
                                   userInfo:(id)userInfo 
                                    repeats:(BOOL)repeats 
在主线程中调用

答案 2 :(得分:7)

您已经创建了一个NSTimer对象,但尚未安排它运行。 timerWithTimeInterval:target:selector:userInfo:repeats:创建一个计时器,您可以安排稍后运行,例如,在应用程序启动时创建计时器,并在用户按下按钮时开始计时。要么打电话

[[NSRunLoop currentRunLoop] addTimer:theTimer forMode:NSDefaultRunLoopMode]

在setTimerForAlarm的末尾或替换

theTimer = [NSTimer timerWithTimeInterval:seconds 
                            target:self 
                          selector:@selector(showAlarm:)
                          userInfo:alarm repeats:NO];

theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
                            target:self 
                          selector:@selector(showAlarm:)
                          userInfo:alarm repeats:NO];

创建一个计时器并立即安排它。

答案 3 :(得分:2)

您可能希望在运行循环中实际安排NSTimer :),而不是timerWithTimeInterval使用scheduledTimerWithTimeInterval

theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
                        target:self 
                      selector:@selector(showAlarm:)
                      userInfo:alarm repeats:NO];

答案 4 :(得分:2)

虽然所有答案都是正确的,但有一个更简单的解决方案,根本不涉及NSTimer。您的setTimerForAlarm:实施可以简化为一个简单的行:

[self performSelector:@selector(showAlarm:) withObject:alarm afterDelay:[[alarm alarmDate] timeIntervalSinceNow]]