2016-04-20 23 views
0

我想顯示一個'NSPanel'爲用戶輸入一個新文件夾的名稱。爲什麼選擇NSPanel?因爲它看起來很棒!它託管一個TextField和一個PushButton來確認名稱。點擊時也應關閉窗口。使用NSPanel進行用戶輸入。沒有再次打開

Image of my NSPanel

它顯示在「添加」按鈕被點擊我的菜單。當NSPanel中的「完成」按鈕被點擊時它也會關閉。但是當我再次單擊「添加」時,它不再顯示。當我通過標題欄中的常規「關閉按鈕」將其關閉時也會發生這種情況。所以它與「完成」-PushButton沒有明確的關係。我還測試了實現func windowWillClose(notification: NSNotification),這兩種情況在任何情況下都不會觸發。可能是什麼問題呢?另外,它每次都需要成爲一個「新」窗口嗎?還是我正確地使用這個用戶輸入?我的意思是它只是實例化一次,然後「顯示」和「未顯示」,或者我錯了嗎?

所以我做了一個新的Cocoa-Class - NSWindowController的子類 - 並讓xCode爲此創建一個.xib。在那個.xib中,我「設計」了NSPanel。我勾選了visible at launch而沒有,當菜單按鈕被點擊時窗口不會出現。我在Cocoa Class中爲NSPanel連接了一個IBOutlet。我此刻類看起來是這樣的:

import Cocoa 

class NamingHUD: NSWindowController, NSWindowDelegate { 
    @IBOutlet var insertNameWindow: NSPanel! 
    @IBOutlet weak var nameTextField: NSTextField! 
    override var windowNibName : String! { 
     return "NamingHUD" 
    } 
    override func windowDidLoad() { 
     super.windowDidLoad() 

     insertNameWindow.center() 
     insertNameWindow.makeKeyAndOrderFront(nil) 
     NSApp.activateIgnoringOtherApps(true) 
    } 
    @IBAction func userSetName(sender: NSButton) { 
     print("Close button clicked") 
     insertNameWindow.close() 
    } 
} 

在我的主類,我宣佈它作爲像這樣的變量:

var namingHUD:NamingHUD! 

,然後在override func awakeFromNib()爲:

namingHUD = NamingHUD() 

爲以及像點擊處理器一樣:

@IBAction func addClicked(sender: NSMenuItem) { 
     namingHUD.showWindow(nil) 
    } 

現在。當我點擊並調用addClicked()時,窗口按預期顯示。精細!我輸入一個名稱並點擊「完成」按鈕,並正確關閉窗口。也很好!但是當我再次點擊時,說添加另一個文件夾,窗口不再顯示。我也以完全相同的方式創建了「首選項」窗口。但是使用Window而不是NSPanel。這完全符合它的要求。

所以我清楚地弄糊塗了什麼或忘記了一些東西。會是什麼呢?我公開承認,這是我第一次在教程之外使用任何窗口。所以我顯然沒有把握它的整個概念。我在Apples Developer Guide中閱讀了關於窗口的內容,它有道理。但是......好吧,目前不起作用。我在「濫用」NSPanel嗎?不應該如此,因爲它從NSWindow繼承或?

回答

0

您是否將NamingHUDwindow插座連接至您的超棒面板?碎粒延遲加載:

namingHUD = NamingHUD() // init the controller but doesn't load the nib 
... 
namingHUD.showWindow(nil) // now you are loading it for the first time 

它可以在第一時間,因爲showWindow()負荷筆尖顯示由window出口引用的窗口。您的面板顯示,因爲它設置爲「啓動時可見」。你當然沒有窗口可以顯示。

後續點擊不會再次加載nib文件,只需要訂購window插座即可顯示。這就是爲什麼你的面板不再顯示。FYI:NSPanelNSWindow的子類,所以它具有NSWindow所具有的一切,然後還有一些。

+0

謝謝!這給了我一點洞察力。現在正在工作。 – user57213

相關問題