1

在我的基於文檔的應用程序中,我添加了一個標籤(NSTextField),以使用新的API我的文檔窗口的標題欄爲10.10:IBOutlet中的的NSTextField在NSTitlebarAccessoryView

我把這個從我的主要NSViewController,我已經控制自帶的窗口免費的主視圖:

class MasterViewControler: NSViewController { 

    @IBOutlet weak var window: NSWindow! 

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

這樣加載包含我的標籤到我的標題欄中的文檔表明自定義視圖。迄今爲止都很好。

現在在某些時候,我必須在運行時訪問該標籤以更改它的字符串值,從我的應用程序中的某處。

我試過了標籤,控制子視圖NSTitlebarAccessoryViewController添加IBOutlet,並從NSTitlebarAccessoryViewController期望我可以操縱標籤stringValue。但我從那裏做不了什麼。

我試圖創建在NSTitlebarAccessoryViewController一個功能設置標籤字符串,並通過NSTitlebarAccessoryViewController()的全局實例從我mainViewControler訪問該功能,但儘管我可以訪問此功能,並把它傳遞一個字符串,則參考了該函數中的標籤IBOutlet總是展開爲零(崩潰)。

那麼爲什麼當函數駐留在任何地方,而不是在函數所在的類的內部訪問時,插件展開爲函數nil?

我必須能夠訪問我的窗口中的控制器或視圖mainView的標籤。

我該怎麼做..?

My Possible Structure

+0

請在下面的答案中看到我的最大努力。我不認爲這很好。 – 2015-02-09 02:55:57

回答

0

我不能爲我的生活找到一個方法來引用我加入到通過IB的窗口標題欄子視圖的標籤,這樣我就可以找到最好的解決方法是這樣的:

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,並且認爲它很重要。

我很擔心這可能很容易破裂,只是不確定是否這樣做。任何更好的解決方案非常感謝