1

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

我从我的 mainNSViewController中调用它,我可以免费控制窗口附带的主视图:

class MasterViewControler: NSViewController {

    @IBOutlet weak var window: NSWindow!

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

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

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

我尝试为控制子视图IBOutlet的标签添加一个NSTitlebarAccessoryViewController,并且正如预期的那样,NSTitlebarAccessoryViewController我可以操作标签stringValue。但我不能从那里做太多。

我尝试在 中创建一个 设置标签字符串的函数,并通过from myNSTitlebarAccessoryViewController的全局实例访问该函数,但是虽然我可以访问此函数并将其传递给字符串,但函数中标签的引用总是展开为无(崩溃)。NSTitlebarAccessoryViewController()mainViewControlerIBOutlet

那么为什么当从函数所在的类中的任何地方访问时,出口在函数中解包为 nil 呢?

我必须能够从控制器访问标签或在我的 windows 中查看mainView

我怎样才能做到这一点..?

我可能的结构

4

1 回答 1

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,并且认为很多是理所当然的。

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

于 2015-02-09T02:55:16.187 回答