Macos NSWindowController/NSDocument生命周期(关闭)

Macos NSWindowController/NSDocument生命周期(关闭),macos,cocoa,nsdocument,nswindowcontroller,Macos,Cocoa,Nsdocument,Nswindowcontroller,我有一个基于“标准”OS X文档的应用程序,使用NSWindowController、NSDocument等。它的UI中有一个NSTextView 我的问题(这让我发疯)是如何最好地捕获“关闭文档”,然后告诉NSTexView完成编辑 完成编辑可能会导致模型被更新(可能还有文档的更改计数),因此我需要在所有其他NSDocument逻辑决定是否需要保存之前执行此操作 谢谢您的文本视图不允许撤消 -(void)setAllowsUndo:(BOOL)value; 您可以通过调用前一个方法禁用它,也

我有一个基于“标准”OS X文档的应用程序,使用NSWindowController、NSDocument等。它的UI中有一个NSTextView

我的问题(这让我发疯)是如何最好地捕获“关闭文档”,然后告诉NSTexView完成编辑

完成编辑可能会导致模型被更新(可能还有文档的更改计数),因此我需要在所有其他NSDocument逻辑决定是否需要保存之前执行此操作


谢谢

您的文本视图不允许撤消

-(void)setAllowsUndo:(BOOL)value;
您可以通过调用前一个方法禁用它,也可以在interface builder(对于textview)中取消选中它。如果文本视图中没有撤消支持,您的文档不会自动变脏(不会生成updateChangeCount,因此文档不知道它已被编辑)

清洁剂解决方案(不允许撤消):

要解决此问题,必须注册为委托并实现textDidChange:(NSTextViewDelegate方法)或注册为NSTextDidChangeNotification。在这些方法中,您可以更新模型和/或使文档变脏/编辑

或者:

当试图关闭窗口/文档时,捕获其中一个事件。和辞职回应者。NSTextView将失去焦点并更新其支持值

[window makeFirstResponder:nil];
捕捉关闭的可能方法的列表

- (void)close;  //you have to call [super close]; 
- (BOOL)windowShouldClose:(NSWindow *)window;
- (void)canCloseDocumentWithDelegate:(id)delegate shouldCloseSelector:(SEL)shouldCloseSelector contextInfo:(void *)contextInfo;
NSTextViewDelegate继承自NSTextDelegate

@protocol NSTextViewDelegate <NSTextDelegate>
@optional
@end

@protocol NSTextDelegate <NSObject>
@optional
- (BOOL)textShouldBeginEditing:(NSText *)textObject;        // YES means do it
- (BOOL)textShouldEndEditing:(NSText *)textObject;          // YES means do it
- (void)textDidBeginEditing:(NSNotification *)notification;
- (void)textDidEndEditing:(NSNotification *)notification;
- (void)textDidChange:(NSNotification *)notification;       // Any keyDown or paste which changes the contents causes this
@end
@protocol-NSTextViewDelegate
@可选的
@结束
@协议NSTextDelegate
@可选的
-(BOOL)text应该开始编辑:(NSText*)textObject;//是的意思是去做
-(BOOL)textShouldEndEditing:(NSText*)textObject;//是的意思是去做
-(无效)textDidBeginEditing:(NSNotification*)通知;
-(作废)文本终止:(NSNotification*)通知;
-(无效)textDidChange:(NSNotification*)通知;//任何更改内容的向下键或粘贴都会导致此问题
@结束