我有一个使用NSWindowController,NSDocument等的'标准'OS X文档应用程序。它有一个NSTextView作为其UI的一部分。
问题我(并且它让我疯狂)是如何最好地捕获'关闭文档'然后告诉NSTexView完成编辑。
完成编辑可能导致模型被更新(可能还有文档的更改计数)所以我需要在所有其他NSDocument逻辑决定是否需要保存之前执行此操作。
由于
答案 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