OS X [NSTimer scheduledTimerWithTimeInterval ...]函数在windowDidLoad中无法正常工作

时间:2012-10-14 09:42:18

标签: macos cocoa splash-screen nswindowcontroller

我是iOS开发人员,正在开发OS X应用程序。 然而,他们彼此之间是如此不同。

我想在应用程序启动时添加启动画面。

- (void) applicationDidFinishLaunching:(NSNotification *)aNotification {

 // Hide main window
 [self.window orderOut:nil];

 SplashWindowController *splashWindowController = [[SplashWindowController alloc] initWithWindowNibName:@"SplashWindowController"];

 [NSApp runModalForWindow:splashWindowController.window];
 [splashWindowController release];

 // Show main window
 ...

这是“SplashWindowController.m”

- (void)windowDidLoad {
  [super windowDidLoad];

  [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(hideSplash) userInfo:nil repeats:NO];
}

- (void)hideSplash {
  [NSApp endSheet:self.window];
  [self.window orderOut:nil];
}

我可以看到出现的splash,但是从不调用hideSplash函数。 是什么原因?

1 个答案:

答案 0 :(得分:3)

我想知道你没有收到错误,但是这行有一个拼写错误:

[NSTimer scheduledTimerWithTimeInterval:2.0 target self selector:@selector(hideSplash) userInfo:nil repeats:NO];

应该是

[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(hideSplash) userInfo:nil repeats:NO];

另一方面,你可以试试这个:

NSTimer *theTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(hideSplash) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:theTimer forMode:NSRunLoopCommonModes];

我不确定[NSTimer ...]是否过早销毁......将其分配给实例应该没问题。此外,运行循环被中断,因此您可以尝试将计时器添加到主运行循环。