NSWindowController / NSDocument生命周期(关闭)

时间:2014-11-19 11:59:48

标签: macos cocoa nsdocument nswindowcontroller

我有一个使用NSWindowController,NSDocument等的'标准'OS X文档应用程序。它有一个NSTextView作为其UI的一部分。

问题我(并且它让我疯狂)是如何最好地捕获'关闭文档'然后告诉NSTexView完成编辑。

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

由于

1 个答案:

答案 0 :(得分:0)

您的textview不允许撤消。

-(void)setAllowsUndo:(BOOL)value;

您可以通过调用前方法禁用它,也可以在界面构建器中取消选中它(对于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