0

我想显示一个“NSPanel”供用户输入新文件夹的名称。为什么是 NSPanel?因为它看起来棒极了!它承载一个 TextField 和一个 PushButton 来确认名称。单击时它也应关闭窗口。

在此处输入图像描述

它在我的菜单中单击“添加”按钮时显示。当单击“完成”按钮时,它也会关闭NSPanel。但是当我再次单击“添加”时,它不再显示了。当我通过标题栏中的普通“关闭按钮”关闭它时,也会发生这种情况。所以它与“完成”-PushButton 没有明确的关系。我还测试func windowWillClose(notification: NSNotification)了在任何一种情况下都不会触发的实现。可能是什么问题呢?此外,它是否每次都需要成为一个“新”窗口?或者我是否正确地将其用于用户输入?我的意思是它只是被实例化一次然后“显示”和“未显示”还是我错了?

所以我做了一个新的 Cocoa-Class - Subclass of NSWindowController- 并让 xCode 也为它创建一个 .xib。在那个 .xib 中,我“设计”了NSPanel. 我没有勾选visible at launch,当单击菜单按钮时,窗口不会出现。我还在我的 Cocoa Class 中连接了一个IBOutletfor 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吗?不应该是这种情况,因为它继承自NSWindowor ?

4

1 回答 1

1

您是否将window插座连接NamingHUD到您的真棒面板?笔尖被懒惰地加载:

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插座显示。这就是您的面板没有再次显示的原因。仅供参考: anNSPanel是的子类,NSWindow因此它拥有所有拥有的东西NSWindow,然后还有更多。

于 2016-04-21T02:43:21.300 回答