隐藏窗口,而不是单击关闭按钮时将其关闭

开发单个窗口式,非基于文档的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相同的结果。

而已! 够简单吗? 😄

(结束)