从单独的笔尖显示 NSWindow(非模态)
Posted
技术标签:
【中文标题】从单独的笔尖显示 NSWindow(非模态)【英文标题】:Show NSWindow from separate nib (not modal) 【发布时间】:2012-08-16 13:59:27 【问题描述】:怎么做?我只是想加载一个窗口并将其显示在主窗口的前面。
NSWindowController* controller = [[NSWindowController alloc] initWithWindowNibName: @"MyWindow"];
NSWindow* myWindow = [controller window];
[myWindow makeKeyAndOrderFront: nil];
此代码显示窗口片刻,然后将其隐藏。恕我直言,这是因为我不保留对窗口的引用(我使用ARC
)。 [NSApp runModalForWindow: myWindow];
完美运行,但我不需要模态显示。
【问题讨论】:
【参考方案1】:是的,如果您没有对窗口的引用,那么在您退出您所在的例程时,它就会被拆除。您需要在 ivar 中对它进行强引用。 [NSApp runModalForWindow: myWindow]
是不同的,因为 NSApplication
对象在模态运行时持有对窗口的引用。
【讨论】:
【参考方案2】:您可能应该执行类似于以下的操作,这会创建一个对您创建的 NSWindowController
实例的 strong
引用:
.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
.m:
#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
请注意,您可以直接使用NSWindowController
的内置showWindow:
方法,而不是将makeKeyAndOrderFront:
方法直接发送到NSWindowController
的NSWindow
。
虽然上面的代码(和下面的示例项目)使用NSWindowController
的自定义子类,但您也使用通用NSWindowController
并使用initWithWindowNibName:
创建实例(只需确保nib 文件的文件所有者为设置为NSWindowController
,而不是像MDWindowController
这样的自定义子类。
示例项目:
http://www.markdouma.com/developer/MDWindowController.zip
【讨论】:
以上是关于从单独的笔尖显示 NSWindow(非模态)的主要内容,如果未能解决你的问题,请参考以下文章
血本急求:将对话框放入 DLL 文件当中,在主程序中作为子窗口非模态显示,做完操作后,释放该 DLL 的方法