Cocoa 为什么飞溅窗口可以’;在应用程序启动前不显示?

Cocoa 为什么飞溅窗口可以’;在应用程序启动前不显示?,cocoa,Cocoa,我想在应用程序午餐前显示启动屏幕。首先,我将SplashWindow子类化为NSWindow,代码如下: - (id)initWithContentRect(NSRect)contentRect styleMask(unsigned int)aStyle backing(NSBackingStoreType)bufferingType defer(BOOL)flag { self = [super initWithContentRect:contentRect styleMask:NSB

我想在应用程序午餐前显示启动屏幕。首先,我将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;

}
然后在主应用程序控制器中从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秒钟后关闭,我使用了[loadWindow orderOut:self]方法,但是当启动窗口关闭时,mainwinow没有显示。我错过了什么?我的应用程序是一个多文档的应用程序。在main menu.nib中有一个窗口(loadwindow),在IB中,我已连接主控制器中的loadwindow插座。我还连接了视图和图像。我改变了另一种方式:在委托方法中:applicationWillFinishLaunching:I orderFront加载窗口,在方法中:applicationdifinishLaunching:I orderOut加载窗口在3秒钟后,但主窗口也没有显示。有人可以给出一些建议或编码结果问题?多谢各位

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

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

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

认真回答问题:

首先,您不需要为NSWindow创建子类

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

第三,您试图向一个尚不存在的窗口询问将用于创建它的框架
loadWindow
nil
,直到您创建了一些东西并将其存储在那里

第四,因为您要求
nil
获取其帧,所以您得到的是一个垃圾矩形。然后用这个垃圾矩形创建一个窗口。毫不奇怪,当你把这个窗口放在屏幕上时,它会出现在一个随机位置(可能在屏幕外),大小随机(可能太大而无法创建或为负数)

第五,是什么让你认为让一个窗口下订单会导致其他窗口下订单?它怎么知道在哪个窗口下订单


撇开不可否认的事实不谈,您应该使用NSWindowController加载窗口并进行设置,如
setBackgroundColor:
setLevel:
。在计时器方法中,您在启动窗口外排序,也必须在主窗口中明确排序。

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

认真回答问题:

首先,您不需要为NSWindow创建子类

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

第三,您试图向一个尚不存在的窗口询问将用于创建它的框架
loadWindow
nil
,直到您创建了一些东西并将其存储在那里

第四,因为您要求
nil
获取其帧,所以您得到的是一个垃圾矩形。然后用这个垃圾矩形创建一个窗口。毫不奇怪,当你把这个窗口放在屏幕上时,它会出现在一个随机位置(可能在屏幕外),大小随机(可能太大而无法创建或为负数)

第五,是什么让你认为让一个窗口下订单会导致其他窗口下订单?它怎么知道在哪个窗口下订单

撇开不可否认的事实不谈,您应该使用NSWindowController加载窗口并进行设置,如
setBackgroundColor:
setLevel:
。在计时器方法中,在启动窗口外进行排序,还必须在主窗口中显式排序