swift2 使用NSPanel进行用户输入,不再打开

vmjh9lq9  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(192)

我想显示一个“NSPanel”让用户输入一个新文件夹的名称。为什么是NSPanel?因为它看起来很棒!它拥有一个TextField和一个PushButton来确认名称。它还应该在单击时关闭窗口。

当在我的菜单中单击“添加”按钮时,它会显示。当在NSPanel中单击“完成”按钮时,它也会关闭。但是当我再次单击“添加”时,它不再显示。当我通过标题栏中的普通“关闭按钮”关闭它时,也会出现这种情况。因此,它与“完成”按钮-PushButton没有显式的关系。我还测试了func windowWillClose(notification: NSNotification)的实现,它也不会显示。在这两种情况下都不会被触发。可能是什么问题呢?还有,它每次都需要一个“新”窗口吗?或者我正确地使用了这个来进行用户输入吗?我的意思是它只被示例化一次,然后“显示”和“不显示”,或者我错了吗?
所以我做了一个新的Cocoa-Class -NSWindowController的子类-并且让xCode也为它创建了一个.xib。在那个.xib中我“设计”了NSPanel。我勾选了visible at launch,如果没有它,当菜单按钮被点击时窗口就不会出现。我还为我的Cocoa类中的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()时,窗口如预期的那样显示。很好!我输入一个名称并点击“完成”按钮,它正确地关闭了窗口。同样很好!但是当我再次点击时,说要添加另一个文件夹,窗口不再出现了。我也用同样的方法创建了一个参数设置窗口。但是里面有一个窗口而不是一个NSPanel。这完全可以正常工作。
所以我很明显地混淆了一些东西或者忘记了一些东西。这会是什么呢?我公开承认,这是我第一次在教程之外使用任何类型的窗口。所以我显然没有掌握它的整个概念。我在苹果开发者指南中读到了关于窗口的内容,这有点道理。但是......嗯,目前不起作用。我是否“误用”了NSPanel?不应该是这样,因为它继承自NSWindow或?

tktrz96b

tktrz96b1#

您是否已将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所具有的一切,并且还具有更多。

相关问题