从单独的笔尖显示 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: 方法直接发送到NSWindowControllerNSWindow

虽然上面的代码(和下面的示例项目)使用NSWindowController 的自定义子类,但您也使用通用NSWindowController 并使用initWithWindowNibName: 创建实例(只需确保nib 文件的文件所有者为设置为NSWindowController,而不是像MDWindowController这样的自定义子类。

示例项目:

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

【讨论】:

以上是关于从单独的笔尖显示 NSWindow(非模态)的主要内容,如果未能解决你的问题,请参考以下文章

NSWindow 的 IBOutlet 组件啥时候初始化?

血本急求:将对话框放入 DLL 文件当中,在主程序中作为子窗口非模态显示,做完操作后,释放该 DLL 的方法

从笔尖加载的 UIView 未显示多个 UILabel

从笔尖加载的 UITableView 单元格不显示背景颜色

Laravel 将数据从 ajax 传递到位于单独文件中的模态视图,导致模态视图无法呈现

在 NSWindow 下方显示内容的最佳方式是啥?