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

当在我的菜单中点击"add“按钮时,它会显示。当在NSPanel中单击“完成”按钮时,它也会关闭。但是当我再次单击"add“时,它就不再出现了。当我通过标题栏中的普通“关闭按钮”关闭它时,也会发生这种情况。因此,它与“完成”-PushButton没有显式关联。我还测试了实现func windowWillClose(notification: NSNotification),这两种情况下都不会触发。有什么问题吗?而且,它是否需要每次都成为一个“新”窗口?或者我是否正确地将它用于用户输入?我的意思是,它只是被实例化一次,然后“显示”和“未显示”,或者我错了吗?
所以我做了一个新的Cocoa类-- NSWindowController的子类--让xCode也为它创建一个.xib。在那个.xib中,我“设计”了NSPanel。我勾选了visible at launch,但当单击菜单按钮时,窗口就不会出现。我还在Cocoa类中为NSPanel安装了一个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()时,窗口将如预期的那样显示出来。很好!我输入一个名字,按下“完成”按钮,它就会正确地关闭窗口。也很好!但是当我再次单击时,比如添加另一个文件夹,窗口就不再出现了。我还以完全相同的方式创建了首选项窗口。但是里面有一个窗口而不是一个NSPanel。这完全是应该做的。
所以我显然混淆了什么或者忘记了什么。会是什么?我公开承认,这是我第一次在学习教程之外的任何一种窗口工作。所以我显然没有理解它的全部概念。我在中读到了关于windows的文章,这是有意义的。但是..。好吧,现在不行。我是不是在“滥用”NSPanel?不应该是这样的,因为它继承自NSWindow或?
发布于 2016-04-21 02:43:21
你把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()加载了nib,和显示了window出口引用的窗口。您的面板显示是因为它被设置为“在启动时可见”。你当然没有窗户可以展示。
随后的单击不要再次加载nib文件,只需命令window出口显示。这就是为什么你的面板没有再次出现。FYI:NSPanel是NSWindow的子类,所以它拥有NSWindow所拥有的一切,然后还有更多。
https://stackoverflow.com/questions/36742661
复制相似问题