为什么启动应用程序之前无法显示启动窗口?

时间:2009-04-01 01:45:22

标签: cocoa

我想在App午餐前显示启动画面。首先,我将SplashWindow子类化为NSWindow,代码为:

- (id)initWithContentRect(NSRect)contentRect 
styleMask(unsigned int)aStyle 
backing(NSBackingStoreType)bufferingType 
defer(BOOL)flag {

self = [super initWithContentRect:contentRect
styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; 
[self setBackgroundColor: 
[NSColor clearColor]]; 
[self setLevel: NSStatusWindowLevel]; 
[self setAlphaValue:1.0]; 
[self setOpaque:NO]; 
[self setHasShadow: YES]; 
return self;

}

然后在主app控制器中从nib唤醒:

loadWindow = [[NSWindow alloc] initWithContentRect:[loadWindow frame] styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]; 
[loadWindow setContentView:theView]; 
[loadWindow setHasShadow:YES]; [
loadWindow setLevel:NSStatusWindowLevel]; 
[loadWindow makeKeyAndOrderFront:self];

然后我让loadWindow在3次secondes后关闭,我使用方法[loadWindow orderOut:self],但是当启动窗口关闭时,mainwinow没有显示。我错过了什么?我的应用程序是一个multi_Documents。并且在mainMenu.nib中有一个窗口(loadwindow),在IB中我连接了主控制器中的loadWindow插座。我还连接了视图和图像。而我改变了另一种方式:在委托方法中:applicationWillFinishLaunching:我orderFront loadWindow,在方法中:applicationDidFinishLaunching:我命令在3秒后输出loadWindow,但是mainWindow也没有显示出来。有人可以给出一些建议或代码结果问题?非常感谢你!

2 个答案:

答案 0 :(得分:3)

对标题的回答:因为您的应用尚未运行。未运行的应用程序无法执行任何操作。

对问题的认真回答:

首先,您不需要子类化NSWindow。

其次,你没有实例化你的子类,你实例化了NSWindow。这就是为什么你没有得到你的子类的行为。 (这就是你应该做的,因为你不需要子类。)

第三,您正在尝试向您将用于创建它的框架询问一个尚不存在的窗口。 loadWindownil,直到之后您创建了一些内容并将其存储在那里。

第四,因为你问nil它的框架,你得到一个垃圾矩形。然后使用此垃圾矩形创建一个窗口。不出所料,当你把这个窗口放在屏幕上时,它会随机出现在一个随机位置(可能是屏幕外),随机大小(可能太大而不能创建或者是负面的)。

第五,是什么让你认为告诉窗口订购会导致其他窗口订购?怎么知道要订购哪个窗口?

除了the very existence of a splash screen punishes the user for using your application这个不可否认的现实外,你应该使用NSWindowController加载窗口并进行setBackgroundColor:setLevel:等设置。在您的计时器方法中,在您订购启动窗口的地方,您还必须在主窗口中显式订购。

答案 1 :(得分:0)

我没有看到任何会在您发布的代码中显示另一个窗口的内容。为什么不尝试发送主窗口makeKeyAndOrderFront:?