在我的基于文档的应用程序中,我使用新的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
中的控制器或视图中访问标签。
我怎么能这样做??
答案 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,并将其视为理所当然。
我很担心这可能很容易打破,只是不确定这样做。任何更好的解决方案都非常感谢。