swift - 在 Swift 中没有 nib 文件的 NSWindowController

标签 swift nswindowcontroller

我是 Cocoa 开发新手。我受雇的团队在不使用 nib 文件的情况下使用 Swift 进行 OS X 开发(显然主菜单除外)。所以,我想在加入团队之前学习这一点。这是我目前所拥有的:

我创建了一个没有 Storyboard的新 OS X 项目。我创建了一个名为 MainWindowController.swift 的新文件,使其成为 NSWindowController 的子类并且没有创建 xib/nib 文件。我还让 MainWindowController 实现了 NSWindowDelegate 协议(protocol)

在 MainMenu.xib 文件中,我默认删除了应用程序附带的窗口,但保留了主菜单。

在应用委托(delegate)中,我删除了窗口的默认 socket 。

然后我在应用程序委托(delegate)中以编程方式创建了一个 NSWindow。我希望 MainWindowController 成为这个窗口的代表。这是我的 AppDelegate 的样子:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    let newWindow = NSWindow(contentRect: NSMakeRect(100, 100, NSScreen.mainScreen()!.frame.width/2, NSScreen.mainScreen()!.frame.height/2), styleMask: NSTitledWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask|NSClosableWindowMask, backing: NSBackingStoreType.Buffered, `defer`: false)

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // Insert code here to initialize your application
        let wc = MainWindowController.init(window: newWindow)
        wc.showWindow(self)
    }

    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }

}

如您所见,我正在创建一个窗口对象,然后在 applicationDidFinishLaunching 方法中,我使用该窗口初始化我的自定义 NSWindowController,然后显示该窗口。我不确定这是否正确。

然后,在我的自定义 NSWindowController 中,我使用“self.window?.delegate = self”使“self”成为窗口的委托(delegate)。这就是我的 MainWindowController 的样子

import Cocoa

class MainWindowController: NSWindowController, NSWindowDelegate {

    override func windowDidLoad() {
        super.windowDidLoad()

        self.window?.delegate = self

        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.

    }

    func windowDidMiniaturize(notification: NSNotification) {
        print("Window minimized")
    }

    func windowWillClose(notification: NSNotification) {
        print("Window closing")
    } 
}

如您所见,我在委托(delegate)方法中有几个测试打印。

当我运行应用程序时,窗口会显示。但是,当我最小化或关闭窗口时,控制台不会打印任何内容。因此,似乎没有为窗口正确设置委托(delegate)。

什么是正确的做事方式?

最佳答案

在您的 AppDelegate 类中,您不想将窗口存储在属性中,而是希望存储窗口 Controller 。按照您现在的方式,没有对窗口 Controller 的强引用,因此当 applicationDidFinishLaunching 完成执行时它会被销毁。窗口 Controller 将保持对其窗口的强引用,因此您不需要保持对窗口的单独强引用。我还将在 applicationDidFinishLaunching 中设置窗口的委托(delegate) - 我不确定在不使用 Nib 时是否调用了 windowDidLoad

我认为您的 AppDelegate 类应该如下所示:

class AppDelegate: NSObject, NSApplicationDelegate {

    let windowController = MainWindowController(
        window: NSWindow(contentRect: NSMakeRect(100, 100, NSScreen.mainScreen()!.frame.width/2, NSScreen.mainScreen()!.frame.height/2), 
        styleMask: NSTitledWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask|NSClosableWindowMask, 
        backing: NSBackingStoreType.Buffered, 
       `defer`: false))

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // Insert code here to initialize your application
        windowController.window?.delegate = windowController
        windowController.showWindow(self)
    }
}

关于swift - 在 Swift 中没有 nib 文件的 NSWindowController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34538112/

相关文章:

objective-c - 在各种 View / Nib 之间共享用于绑定(bind)的对象(特别是 NSDocument)

ios - Swift - Mopub 原生广告已成功加载但未显示在 View 中

快速重置 transitionInView

swift - 'window' 不是 Swift iOS 开发中的标识符吗?

objective-c - 将对象上的自定义 init 方法设置为 initWithWindowNibName NSWindowController 属性

objective-c - 如何关闭从 NSWindowController 启动的窗口

swift - 如何在捕获 session 上使用 CIFilter 和 CIPerspectiveCorrection?

ios - 在 Swift 3/xCode 8 中从表视​​图 Controller 中选择数据时如何更改不同 View Controller 的标签?

macos - 防止关闭 NSWindow 时出现保存提示

Cocoa:插件无法打开应用程序窗口