windowDidLoad()从未使用故事板调用mac

时间:2014-06-07 13:10:07

标签: xcode storyboard swift

我刚刚使用了Xcode 6中包含的新mac故事板功能。我已经使用故事板和swift设置了一个新的OS X项目,然后我创建了一个新的文件MainWindowController.swift,创建了初始化程序init(coder: NSCoder!)(因为否则编译器会警告我)并将所有内容挂钩到Main.storyboard文件中(为{Window}中的WindowController设置MainWindowController - 类检查员)。

一切正常,我的窗口显示指定的window content - 视图。但我永远不会调用我在windowDidLoad函数中编写的代码。让它像:

override func windowDidLoad() {
    super.windowDidLoad()

    println("Executed")
}

我还测试了我的初始化程序是否被调用 - 它是。

有人有线索吗?我之前从未在iOS上集中使用过故事板,也许我错过了一些实质性的东西。

2 个答案:

答案 0 :(得分:3)

在Yosemite中,NSViewController已经推出了强大的新功能,使其可以与Storyboard一起使用。同时,NSWindowController被降级。使用Storyboard,不再从笔尖加载窗口,因此不再调用windowDidLoad()。

窗口本身变得不那么重要,有利于它实际包含的更强大的视图。我在此页面上的其他答案显示了如何设置AppDelegate以自定义窗口外观。有更多细节on another page here,关于使用AppDelegate实现您之前在NSWindowController中所做的一些事情。

但是,如果您只想捕获windowDidLoad()作为自定义窗口外观选项的方法,那么在Interface Builder中执行此操作 非常简单 ,只需将它们作为用户定义的运行时属性添加到NSWindow对象。您不需要子类化NSWindowController或编写任何代码。只需通过Identity Inspector窗格将这些值插入NSWindow对象,即可获得AppDelegate示例代码中显示的相同效果:

Keypath: titlebarAppearsTransparent, Type: Boolean, Value: Checked
Keypath: titleVisibility, Type: Number, Value: 1
Keypath: styleMask, Type: Number, Value: 32783

查看标题以确定常量的实际数值。

(例如:NSWindowTitleVisibility.Hidden = 1)

当然,你不能指定styleMask的各个位,但很容易将它们全部加在一起并获得一个数字来指定样式。

答案 1 :(得分:2)

从Main.storyboard文件中删除除应用程序场景之外的所有内容,而是为应用程序窗口创建一个新的Application.storyboard。实现应用程序委托类并将其连接到Main.storyboard中的Application对象。使用此类来实例化窗口控制器并为应用程序窗口设置自定义选项。

class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidBecomeActive(notification: NSNotification) {

        let storyboard = NSStoryboard(name: "Application", bundle: nil)
        applicationController = storyboard.instantiateInitialController() as? NSWindowController
        if let window = applicationController?.window {
            window.titlebarAppearsTransparent = true
            window.titleVisibility = NSWindowTitleVisibility.Hidden
            window.styleMask |= NSFullSizeContentViewWindowMask
            applicationController!.showWindow(self)
        }
    }

}

使用Xcode为项目自动创建的NSViewController的ViewController.swift子类,而不是子类化NSWindowController。

在故事板中,注意如何建立连接"窗口内容"到ViewController。因此,ViewController现在可以执行您之前在窗口控制器中完成的操作。

ViewController.swift文件已经有一个viewDidLoad()的默认覆盖,它将在窗口加载时被调用,就像你期望windowDidLoad()被调用一样,如果它是NSWindowController的子类。

    override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    println("Executed")

}