【问题标题】:NSWindowController cannot open NSWindow for second timeNSWindowController 无法第二次打开 NSWindow
【发布时间】: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


【解决方案1】:

我找到了我的BBPreferencesWindowController没有很好地管理窗口的原因:在XIB中,文件所有者window出口没有正确链接。

解决此问题也解决了所有其他问题。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多