【发布时间】:2013-04-13 11:57:31
【问题描述】:
我有一个 NSWindowController 子类,BBPreferencesWindowController
@implementation BBPreferencesWindowController
- (NSString *)windowNibName
{
return @"PreferencesWindow";
}
...
还有我的AppDelegate中的一个函数,可以通过这个控制器打开“PreferencesWindow.xib”中的窗口。
这个函数从一个 NSMenuItem 调用,附加到系统菜单栏中 NSStatusItem 项下的一个 NSMenu。
@property (strong) BBPreferencesWindowController *preferencesWindow;
...
- (void)openPreferences
{
if (self.preferencesWindow == nil)
{
self.preferencesWindow = [[BBPreferencesWindowController alloc] init];
}
[self.preferencesWindow showWindow:self];
NSLog(@"%@", self.preferencesWindow.window.isVisible ? @"YES" : @"NO");
}
第一次单击 NSMenuItem 时窗口显示良好(尽管 NSLog 行记录“NO”),但是当我关闭窗口然后尝试通过再次单击 NSMenuItem 重新打开它时,窗户打不开。
我错过了什么?
谢谢!
编辑:
BBPreferencesWindowController 没有自定义初始化方法。它确实有一个自定义的awakeFromNib(第一次被调用)
- (void)awakeFromNib
{
[super awakeFromNib];
NSLog(@"Loaded!");
}
【问题讨论】:
-
在BBPreferencesWindowController的init方法中做了什么?发表它。默认初始化程序应该是 initWithWindowNibName:owner: .
-
在您的 openPreferences 中,您仅在
self.preferencesWindow为 nil 时创建一个新控制器,除非您出于某种原因清除它,否则不会创建新控制器。关窗时你会这样做吗? -
没有。我将如何以最好的方式实现这一点?
AppDelegate中的委托或销毁windowDidClose中的控制器? -
难道没有办法在不清除窗口控制器的情况下重新打开窗口吗?
-
这将取决于您的窗口在 XIB 中的设置方式。如果它们设置为在关闭时销毁,您将不会得到任何响应,并且可能需要创建一个新控制器。如果它们只是在关闭时隐藏,这应该可以工作。
标签: objective-c nswindowcontroller