在NSTitlebarAccessoryView中的NSTextField的IBOutlet

时间:2015-02-08 20:57:53

标签: swift cocoa desktop-application iboutlet nstitlebaraccessoryviewcontroller

在我的基于文档的应用程序中,我使用新的10.10 API将标签(NSTextField)添加到文档窗口的标题栏中:

我从我的主NSViewController打电话给我,我已经免费控制了窗口附带的主视图:

class MasterViewControler: NSViewController {

    @IBOutlet weak var window: NSWindow!

    override func viewDidLoad() {
        super.viewDidLoad()
        window.addTitlebarAccessoryViewController(TitleBarSubviewControler(nibName: "TitleBarSubview", bundle: NSBundle.mainBundle())!)
    }

因此,正如文档建议的那样,将包含我的标签的自定义视图加载到我的标题栏中。到目前为止一切都很好。

现在在某些时候我必须在运行时访问该标签,以便从我的app中的某个位置更改它的字符串值。

我尝试将标签的IBOutlet添加到控制子视图的NSTitlebarAccessoryViewController,并且正如NSTitlebarAccessoryViewController所期望的那样,我可以操作标签stringValue。但我从那里做不了多少。

我尝试在NSTitlebarAccessoryViewController中创建一个设置标签字符串的函数,并通过我NSTitlebarAccessoryViewController()的{​​{1}}的全局实例访问该函数,但我可以访问它函数并传递一个字符串,函数中的标签mainViewControler的引用总是作为nil(崩溃)解包。

那么为什么在从函数所在的类中进行访问时,函数在函数中展开为nil。?

我必须能够从我的窗口IBOutlet中的控制器或视图中访问标签。

我怎么能这样做??

My Possible Structure

1 个答案:

答案 0 :(得分:0)

我无法为我的生活找到一种方法来引用我通过IB添加到Windows标题栏的子视图中的标签,因此我能找到的最佳解决方法是:

class WindowControler: NSWindowController {

    var titlebarLabel:NSTextField?

    override func windowDidLoad() {
        super.windowDidLoad()
        // add the titlebar subview
        window?.addTitlebarAccessoryViewController(TitlebarSubviewControler(nibName: "TitlebarSubview", bundle: NSBundle.mainBundle())!)
        // get reference to the titlibarLabel I just added in the line above
        var subviewsOfTheLastTitleBarView: AnyObject? = window?.standardWindowButton(NSWindowButton.ZoomButton)?.superview?.subviews.last?.subviews[0]
        var titlebarNSTextField: AnyObject? = subviewsOfTheLastTitleBarView?.subviews[0]
        titlebarLabel = (titlebarNSTextField! as NSTextField)
    }

    @IBAction func tempbuttonclicked(sender: AnyObject) {
        titlebarLabel?.stringValue = "Text seen in titlebar subview"
    }

}

所以我在这里搜索标题栏,在我将它添加到windowDidLoad第一行的标题栏后立即查找NSTextField,并将其视为理所当然。

我很担心这可能很容易打破,只是不确定这样做。任何更好的解决方案都非常感谢。