![](/img/trans.png)
[英]How to add IBOutlet of a NSTextField in a custom View correctly in macOS?
[英]IBOutlet for NSTextField in NSTitlebarAccessoryView
在基於文檔的應用程序中,我使用適用於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())!)
}
這樣就可以按照文檔建議將包含我的標簽的自定義視圖加載到標題欄中。 到目前為止一切都很好。
現在,我必須在運行時訪問該標簽,以從我的應用程序中的某個位置更改其字符串值。
我嘗試將標簽的IBOutlet
添加到控制子視圖的NSTitlebarAccessoryViewController
,並且可以從NSTitlebarAccessoryViewController
期望的NSTitlebarAccessoryViewController
我可以操縱標簽stringValue
。 但是我不能在那里做很多事情。
我嘗試在NSTitlebarAccessoryViewController
中創建一個設置標簽字符串的函數,然后通過NSTitlebarAccessoryViewController()
的全局實例訪問該函數,但是盡管我可以訪問此函數並將其傳遞給字符串,但mainViewControler
引用標簽IBOutlet
在函數中總是解開為nil(崩潰)。
那么,當從函數所在類之外的任何地方進行訪問時,為什么出口在函數中未顯示為nil?
我必須能夠從控制器訪問標簽或在Windows mainView
查看。
我怎樣才能做到這一點..?
我一生無法找到一種方法來引用通過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,這是理所當然的。
我很擔心這很容易打破,只是不確定這樣做。 任何更好的解決方案,不勝感激。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.