当前位置:  开发笔记 > IOS > 正文

在Swift中没有nib文件的NSWindowController

如何解决《在Swift中没有nib文件的NSWindowController》经验,为你挑选了1个好方法。

我是初学Cocoa开发人员.我被聘用的团队在Swift中进行OS X开发而不使用nib文件(显然主菜单除外).所以,在我加入团队之前,我正在努力学习这一点.这是我到目前为止:

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

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

在app delegate中,我删除了窗口的默认插座.

然后我在app 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'成为窗口的委托.这就是我的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")
    } 
}

如您所见,我在委托方法中有几个测试打印.

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

做事的正确方法是什么?



1> Aaron Rasmus..:

在您的AppDelegate课程中,您不想将窗口存储在属性中,而是要存储窗口控制器.你现在拥有它的方式,没有对窗口控制器的强引用,因此在applicationDidFinishLaunching完成执行时会被销毁.窗口控制器将保持对其窗口的强引用,因此您不需要对窗口保持单独的强引用.我也会设置窗口的委托applicationDidFinishLaunching- 我不确定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)
    }
}

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有