swift - NSTitlebarAccessoryView 中 NSTextField 的 IBOutlet

标签 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())!)
    }

这样就可以按照文档的建议将包含我的标签的自定义 View 加载到我的标题栏中。到目前为止一切都很好。

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

我尝试将标签的 IBOutlet 添加到控制 subview 的 NSTitlebarAccessoryViewController 中,正如 NSTitlebarAccessoryViewController 所期望的那样,我可以操纵标签 stringValue。但我不能从那里做太多事情。

我尝试在 NSTitlebarAccessoryViewController 中创建一个函数来设置标签字符串,并通过我的 mainViewControler 中的 NSTitlebarAccessoryViewController() 的全局实例访问该函数,但尽管我可以访问此函数并向其传递一个字符串,但函数中标签 IBOutlet 的引用始终解包为 nil(崩溃)。

那么为什么当从函数所在的类内部以外的任何地方访问时,outlet 在函数中展开为 nil。?

我必须能够从 Controller 访问标签或在我的窗口 mainView 中查看。

我该怎么做...?

My Possible Structure

最佳答案

我终其一生都找不到一种方法来引用我通过 IB 添加到 Windows 标题栏的 subview 中的标签,所以我能找到的最佳解决方法是:

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

我很担心这会很容易坏掉,只是不确定是否要这样做。非常感谢任何更好的解决方案。

关于swift - NSTitlebarAccessoryView 中 NSTextField 的 IBOutlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28399289/

相关文章:

ios - 如何在 Swift 中将标签和 UIButton 添加到 tableViewSection header ?

macos - 检索可以在给定 URL 处打开文件的所有应用程序包标识符

objective-c - 用于 Cocoa-touch 的 NSNumberFormatter?

google-sheets-api - 如何设置 Google Sheets API 供个人使用

php - Web 应用程序转换为桌面应用程序

通过 USB 连接的任何设备的 C# IMEI 检测

swift - 在 Swift 函数设计中什么时候应该有参数标签,什么时候应该省略参数标签?

ios - 覆盖 touchesBegan : Error - method does not override any method from superclass

ios - 我的 xib 文件中的自动布局约束有什么问题?

iphone - NSString 到 NSArray