【问题标题】:How does window management work in Mac development for MenuBar apps?窗口管理如何在 Mac 开发中为 MenuBar 应用程序工作?
【发布时间】:2011-07-16 15:38:59
【问题描述】:

我先说这是我的第一个 Mac 应用程序,尽管我已经构建 iOs 应用程序有一段时间了。

我有一个菜单栏应用程序(系统托盘应用程序),我的意思是我有 this

我现在想展示我在 Interface Builder 中创建的 NSWindow,因此我创建了一个派生自 NSWindow 的类。让我的班级成为 Window 的代表,并从 App Delegate 执行此操作:

MyClass *myClass = [[MyClass alloc] init];
[myClass display];
[myClass center];
[NSApp activateIgnoringOtherApps:YES];
[viewer makeKeyAndOrderFront:nil];

这似乎显示了一个没有标准窗口按钮(最小化、最大化、关闭)的窗口,而不是我定义的窗口。

这是显示窗口的正确方式吗?以及应该如何定义 Window 以显示我设计的界面?

在 Windows 窗体编程中,这将是:

Form myForm = new Form();
myForm.Show();

【问题讨论】:

    标签: cocoa macos window


    【解决方案1】:

    除非你想覆盖窗口的行为,否则你很少需要继承 NSWindow。更典型的使用场景是使用 NSWindowController 的实例或 NSWindowController 的子类来管理窗口,方法是将该类设置为 Interface Builder 中的 File's Owner。完成此操作后,要获取窗口实例,请使用:

    NSWindowController *wc = [[NSWindowController alloc] initWithWindowNibName:@"NIBNAMEHERE"];
    [wc showWindow:nil];
    

    您的应用程序中的另一种选择是将 NSWindow IBOutlet 添加到您的应用程序委托中,并在您的应用程序委托中加载窗口:

    [NSBundle loadNibNamed:@"NIBFILENAME" owner:self];
    [_window makeKeyAndOrderFront];
    

    【讨论】:

    • 感谢您的回复,尽管我真的不想将我的窗口逻辑放在应用程序委托中,但选项二很有效。我将 FileOwner 更改为 MyClass 并在我的应用程序委托中设置它的一个实例并调用您的选项 2 代码。它就像一个魅力!我现在唯一的问题是似乎发生的唯一事件是 AwakeFromNib,WindowWillLoad 没有触发。
    • 或者 awakeFromNib 是初始化窗口内容的正常位置吗?
    • windowWillLoad 仅在 NSWindowController 和子类上调用,因此如果您采用选项 2 awakeFromNib: 是初始化代码的最佳位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2018-01-08
    • 1970-01-01
    • 2013-02-26
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多