我想在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也没有显示出来。有人可以给出一些建议或代码结果问题?非常感谢你!
答案 0 :(得分:3)
对标题的回答:因为您的应用尚未运行。未运行的应用程序无法执行任何操作。
对问题的认真回答:
首先,您不需要子类化NSWindow。
其次,你没有实例化你的子类,你实例化了NSWindow。这就是为什么你没有得到你的子类的行为。 (这就是你应该做的,因为你不需要子类。)
第三,您正在尝试向您将用于创建它的框架询问一个尚不存在的窗口。 loadWindow
为nil
,直到之后您创建了一些内容并将其存储在那里。
第四,因为你问nil
它的框架,你得到一个垃圾矩形。然后使用此垃圾矩形创建一个窗口。不出所料,当你把这个窗口放在屏幕上时,它会随机出现在一个随机位置(可能是屏幕外),随机大小(可能太大而不能创建或者是负面的)。
第五,是什么让你认为告诉窗口订购会导致其他窗口订购?怎么知道要订购哪个窗口?
除了the very existence of a splash screen punishes the user for using your application这个不可否认的现实外,你应该使用NSWindowController加载窗口并进行setBackgroundColor:
和setLevel:
等设置。在您的计时器方法中,在您订购启动窗口的地方,您还必须在主窗口中显式订购。
答案 1 :(得分:0)
我没有看到任何会在您发布的代码中显示另一个窗口的内容。为什么不尝试发送主窗口makeKeyAndOrderFront:?