使用 NSPanel 进行用户输入。不再开放

Use NSPanel for user input. Not opening up again

我想显示一个 'NSPanel' 供用户输入新文件夹的名称。为什么是 NSPanel?因为它看起来棒极了!它托管一个 TextField 和一个 PushButton 以确认名称。单击时还应关闭 window。

在我的菜单中单击 "add" 按钮时显示。当 NSPanel 中的 "done" 按钮被点击时,它也会关闭。但是当我再次单击 "add" 时,它不再显示了。当我通过标题栏中的正常 "close button" 关闭它时也会发生这种情况。所以它与 "done"-PushButton 没有明确的关系。我还测试了 func windowWillClose(notification: NSNotification) 的实现,这在任何一种情况下都不会被触发。可能是什么问题呢?另外,它是否每次都需要 "new" window?或者我是否正确地使用它来进行用户输入?我的意思是它只被实例化一次然后 "shown" 和 "unshown" 还是我错了?

所以我做了一个新的 Cocoa-Class - NSWindowController 的子类 - 并让 xCode 也为此创建一个 .xib。在那个 .xib 中我 "designed" NSPanel。我勾选了 visible at launch,但单击菜单按钮时 window 不会出现。我还在我的 Cocoa Class 中为 NSPanel 连接了一个 IBOutlet。我的 Class 目前看起来像这样:

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()
    }
}

在我的 Main Class 中,我将其声明为这样的变量:

var namingHUD:NamingHUD!

然后在 override func awakeFromNib() 中作为:

namingHUD = NamingHUD()

以及点击处理程序,例如:

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

现在。当我单击并调用 addClicked() 时,window 会按预期显示。美好的!我输入一个名称并点击 "done" 按钮,它正确地关闭了 window。还好!但是当我再次点击,说要添加另一个文件夹时,window 不再显示了。我还以完全相同的方式创建了首选项 Window。但是里面有一个 Window 而不是 NSPanel 。这完全可以正常工作。

所以我显然混淆了一些东西或者忘记了一些东西。会是什么呢?我公开承认这是我第一次在遵循教程之外使用任何类型的 window。所以我显然没有掌握它的全部概念。我在 Apples Developer Guide 中阅读了有关 windows 的内容,这有点道理。但是……好吧,目前不起作用。我 "misusing" 是 NSPanel 吗?不应该是这种情况,因为它继承自 NSWindow 或?

您是否将 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 插座引用的 window。您的面板显示是因为它设置为 "Visible at launch"。你当然没有 window 显示。

后续点击不会再次加载 nib 文件,只会显示 window 插座。这就是为什么您的面板没有再次显示的原因。仅供参考:NSPanelNSWindow 的子类,因此它具有 NSWindow 所具有的一切,然后还有更多。