我想要显示一个NSPanel'供用户输入新文件夹的名称。为什么选择NSPanel?因为它看起来很棒!它托管一个TextField和一个PushButton来确认名称。单击时也应关闭窗口。
当"添加"按钮在我的菜单中被点击。当"完成"它也会关闭。按钮在NSPanel
中被点击。但是当我点击"添加"它再也不会出现了。当我通过正常的"关闭按钮关闭它时也会发生这种情况。在标题栏中。所以它并没有与" done" -PushButton明确相关。我还测试了实现func windowWillClose(notification: NSNotification)
,在任何一种情况下也都没有触发。可能是什么问题呢?此外,它是否需要成为一个新的"窗口每次?或者我是否正确使用此用户输入?我的意思是它只是被实例化一次然后"显示"并且"未示出"或者我错了吗?
所以我做了一个新的Cocoa-Class - NSWindowController
的子类 - 让xCode为它创建一个.xib。在那个.xib I"设计" NSPanel
。我勾选了visible at launch
,但没有在单击菜单按钮时窗口不会出现。我还在我的Cocoa Class中为IBOutlet
连接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开发人员指南中读到了关于windows的内容,这有点道理。但是......好吧,目前还没有工作。我是否会误用" NSPanel
?不应该是这种情况,因为它继承自NSWindow
或?
答案 0 :(得分:1)
您是否已将window
NamingHUD
插座连接到您真棒的面板上? Nibs懒洋洋地加载:
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
出口显示。这就是为什么你的小组没有再次展示的原因。仅供参考:NSPanel
是NSWindow
的子类,因此它包含NSWindow
所拥有的所有内容,然后是其他内容。