我想顯示一個'NSPanel'爲用戶輸入一個新文件夾的名稱。爲什麼選擇NSPanel?因爲它看起來很棒!它託管一個TextField和一個PushButton來確認名稱。點擊時也應關閉窗口。使用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
繼承或?
謝謝!這給了我一點洞察力。現在正在工作。 – user57213