如何防止窗口标题显示“已编辑”的NSD文档是否脏?
我正在使用网络服务管理自己的保存和自动保存,并且不想让标题栏中的注意力分散。
我试过覆盖:
-isDocumentEdited
和-hasUnautosavedChanges
始终返回NO
。-[NSWindowController setDocumentEdited]
无所事事,或始终使用NO
,无论参数的实际值如何。-[NSWindowController synchronizeWindowTitleWithDocumentName]
什么都不做。-[NSWindow setDocumentEdited]
无所事事,或始终使用NO
,无论参数的实际值如何。在所有情况下,当我对保存的文档进行更改时,标题栏仍会更改为“已编辑”。
如果我覆盖-[NSDocument updateChangeCount:]
和-[NSDocument updateChangeCountWithToken:forSaveOperation:]
什么都不做,我可以防止这种情况发生,但它也会影响保存,自动保存和其他文档行为。
我也试过这个:
[[self.window standardWindowButton: NSWindowDocumentVersionsButton] setTitle:nil];
显示空白字符串而不是编辑,但短划线仍然出现 - 通常是分隔文档名称和编辑的字符串。
知道如何从文档中撬开窗口的这一部分吗?
答案 0 :(得分:6)
有几个选择:
要获取指向“破折号”的指针,请在[window.contentView.superview.subviews]中查找带有stringValue等于“ - ”的TextField。您也可以将其文本设置为空字符串。
@implementation NSWindow (DashRetrivalMethod)
- (NSTextField*)versionsDashTextField
{
NSTextField* res = nil;
NSView* themeFrame = [self.contentView superview];
for (NSView* tmp in [themeFrame subviews])
{
if ([tmp isKindOfClass:[NSTextField class]])
{
if ([[(NSTextField*)tmp stringValue] isEqualToString:@"—"])
{
res = (NSTextField*)tmp;
break;
}
}
}
return res;
}
@end
您可以覆盖NSWindow的-setRepresentedURL:。这也会影响NSWindowDocumentIconButton和弹出菜单,但如果需要,可以手动创建它:[NSWindow standardWindowButton:NSWindowDocumentIconButton]。
覆盖这三个NSDocument的未记录方法之一:
// Always return here NO if you don't want the version button to appear.
// This seems to be the cleanest options, besides the fact that you are
/// overriding a private method.
- (BOOL)_shouldShowAutosaveButtonForWindow:(NSWindow*)window;
// Call super with NO
- (void)_setShowAutosaveButton:(BOOL)flag;
// Here the button and the dash are actually created
- (void)_endVersionsButtonUpdates;
// Here Cocoa hide or unhide the edited button
- (void)_updateDocumentEditedAndAnimate:(BOOL)flag
答案 1 :(得分:1)
除了覆盖- (BOOL)hasUnautosavedChanges
之外,您是否尝试覆盖NSDocuments - (BOOL) isDocumentEdited
?
答案 2 :(得分:0)
虽然这是一个迟到的答案,但您可以通过覆盖轻松确定NSDocument窗口的标题
- (NSString *)windowTitleForDocumentDisplayName:(NSString *)displayName
在您的NSWindowController中并返回相应的标题。
您也可以通过覆盖NSDocument的属性来执行此操作:
- (NSString *)displayName
但这是Apple推荐的不,因为它通常由操作系统错误处理程序使用。
我添加了这个答案,因为其他答案都没有让我走上正确的道路。