我想显示一个“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
或?
1条答案
按热度按时间tktrz96b1#
您是否已将
NamingHUD
的window
插座连接到您的出色面板上?笔尖加载缓慢:它第一次工作是因为
showWindow()
加载笔尖和显示window
插座引用的窗口。你的面板显示是因为它被设置为“启动时可见”。你的当然没有窗口可显示。随后的点击不会再次加载nib文件,只会显示
window
插座。这就是为什么你的面板没有再次显示。FYI:NSPanel
是NSWindow
的子类,因此它具有NSWindow
所具有的一切,并且还具有更多。