Roo*_*Pro 6 nswindowcontroller swift
我是初学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
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在创建一个窗口对象,然后在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")
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我在委托方法中有几个测试打印.
当我运行应用程序时,窗口会显示.但是,当我最小化或关闭窗口时,没有任何内容被打印到控制台.因此,似乎没有为窗口正确设置委托.
做事的正确方法是什么?
在您的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)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2577 次 |
| 最近记录: |