隐藏窗口,而不是单击关闭按钮时将其关闭
开发单个窗口式,非基于文档的Cocoa应用程序时出现问题。 也就是说,当用户单击窗口上的关闭按钮时,它将关闭,但是无法将其恢复。
为了解决这个问题,我们应该“隐藏”窗口,而不是在用户尝试关闭窗口时将其关闭。
Xcode模板的最新版本针对单个窗口应用程序使用情节提要和窗口控制器,除其窗口控制器外,无法将窗口的委托连接到其他对象。
因此,这给了我们两个选择:1.子类化NSWindowController; 2.用代码将窗口的委托连接到目标对象,例如一个NSViewController对象。
解决方案1.子类化NSWindowController
创建一个新的NSWindowController子类,并在头文件中添加协议一致性(如果使用Swift,则不这样):
目标C:
@interface VCWindowController:NSWindowController
@结束
在实现文件中:
#import“ VCWindowController.h”
@interface VCWindowController()
@结束
@implementation VCWindowController
-(void)windowDidLoad {
[super windowDidLoad];
//实现此方法以处理从其nib文件加载窗口控制器的窗口之后的所有初始化。
}
-(BOOL)windowShouldClose:(id)sender {
[NSApp hide:nil];
返回否;
}
@结束
迅速:
进口可可
VCWindowController类:NSWindowController,NSWindowDelegate {
是否需要初始化?(编码器:NSCoder){
super.init(编码器:编码器)
}
func windowShouldClose(sender:AnyObject)-> Bool {
NSApp.hide(无)
返回假
}
}
创建类后,现在可以将代码连接到窗口。
一种。 将窗口控制器设置为自定义NSWindowController子类:
b。 右键单击Window,将“代理”连接到Window Controller对象:
现在构建并运行您的应用程序,单击“关闭”按钮将仅隐藏您的应用程序,而不是关闭它。
解决方案2.在代码中设置窗口委托
一种。 在您的NSViewController子类中,向NSWindowDelegate协议添加一致性:
目标C:
//在执行文件中
@interface ViewController()
@结束
...
迅速:
类ViewController:NSViewController,NSWindowDelegate {
...
}
b。 实现必要的委托方法:
目标C:
-(BOOL)windowShouldClose:(id)sender {
[NSApp hide:nil];
}
迅速:
func windowShouldClose(sender:AnyObject)-> Bool {
NSApp.hide(无)
返回假
}
C。 用代码将窗口连接到其委托:
目标C:
-(void)awakeFromNib {
[super awakeFromNib];
self.view.window.delegate =自我;
}
迅速:
有趣的awakeFromNib(){
super.awakeFromNib()
view.window.delegate =自我
}
生成并运行您的应用程序,您将看到与解决方案1相同的结果。
而已! 够简单吗? 😄
(结束)