3

怎么做?我只是想加载一个窗口并将其显示在主窗口的前面。

NSWindowController* controller = [[NSWindowController alloc] initWithWindowNibName: @"MyWindow"];
NSWindow* myWindow = [controller window];
[myWindow makeKeyAndOrderFront: nil];

此代码显示窗口片刻,然后将其隐藏。恕我直言,这是因为我不保留对窗口的引用(我使用ARC)。[NSApp runModalForWindow: myWindow];完美地工作,但我不需要模态地展示它。

4

2 回答 2

6

是的,如果您不持有对窗口的引用,那么在您退出您所在的例程时,它将立即被拆除。您需要在 ivar 中持有对它的强引用。[NSApp runModalForWindow: myWindow]是不同的,因为NSApplication只要对象以模态方式运行,它就持有对窗口的引用。

于 2012-08-16T15:34:24.130 回答
1

您可能应该执行类似于以下的操作,这会创建对您创建的实例的strong引用:NSWindowController

。H:

@class MDWindowController;
@interface MDAppDelegate : NSObject <NSApplicationDelegate> {
    __weak IBOutlet NSWindow        *window;
    MDWindowController              *windowController;
}
@property (weak) IBOutlet NSWindow *window;
@property (strong) MDWindowController *windowController;

- (IBAction)showSecondWindow:(id)sender;
@end

米:

#import "MDAppDelegate.h"
#import "MDWindowController.h"

@implementation MDAppDelegate

@synthesize window;
@synthesize windowController;

- (IBAction)showSecondWindow:(id)sender {
    if (windowController == nil) windowController =
                        [[MDWindowController alloc] init];
    [windowController showWindow:nil];
}

@end

请注意,您可以只使用' 的内置方法,而不是将makeKeyAndOrderFront:方法直接发送到NSWindowController's 。NSWindowNSWindowControllershowWindow:

虽然上面的代码(和下面的示例项目)使用 的自定义子类NSWindowController,但您也使用泛型NSWindowController并使用创建实例initWithWindowNibName:(只需确保将 nib 文件的 File's Owner 设置为NSWindowController而不是自定义子类,如MDWindowController)。

示例项目:

http://www.markdouma.com/developer/MDWindowController.zip

于 2012-08-16T16:02:50.170 回答