我想显示一个“NSPanel”供用户输入新文件夹的名称。为什么是 NSPanel?因为它看起来棒极了!它承载一个 TextField 和一个 PushButton 来确认名称。单击时它也应关闭窗口。
它在我的菜单中单击“添加”按钮时显示。当单击“完成”按钮时,它也会关闭NSPanel
。但是当我再次单击“添加”时,它不再显示了。当我通过标题栏中的普通“关闭按钮”关闭它时,也会发生这种情况。所以它与“完成”-PushButton 没有明确的关系。我还测试func windowWillClose(notification: NSNotification)
了在任何一种情况下都不会触发的实现。可能是什么问题呢?此外,它是否每次都需要成为一个“新”窗口?或者我是否正确地将其用于用户输入?我的意思是它只是被实例化一次然后“显示”和“未显示”还是我错了?
所以我做了一个新的 Cocoa-Class - Subclass of NSWindowController
- 并让 xCode 也为它创建一个 .xib。在那个 .xib 中,我“设计”了NSPanel
. 我没有勾选visible at launch
,当单击菜单按钮时,窗口不会出现。我还在我的 Cocoa Class 中连接了一个IBOutlet
for the 。NSPanel
我现在的班级看起来像这样:
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 中阅读了有关 windows 的信息,这有点道理。但是......好吧,目前不起作用。我在“滥用”NSPanel
吗?不应该是这种情况,因为它继承自NSWindow
or ?