覆盖NSDocument窗口标题中的“已编辑”

时间:2012-04-27 02:36:26

标签: cocoa osx-lion nswindow nsdocument nswindowcontroller

如何防止窗口标题显示“已编辑”的NSD文档是否脏?

我正在使用网络服务管理自己的保存和自动保存,并且不想让标题栏中的注意力分散。

我试过覆盖:

  • NSDocument的-isDocumentEdited-hasUnautosavedChanges始终返回NO
  • -[NSWindowController setDocumentEdited]无所事事,或始终使用NO,无论参数的实际值如何。
  • -[NSWindowController synchronizeWindowTitleWithDocumentName]什么都不做。
  • -[NSWindow setDocumentEdited]无所事事,或始终使用NO,无论参数的实际值如何。

在所有情况下,当我对保存的文档进行更改时,标题栏仍会更改为“已编辑”。

如果我覆盖-[NSDocument updateChangeCount:]-[NSDocument updateChangeCountWithToken:forSaveOperation:]什么都不做,我可以防止这种情况发生,但它也会影响保存,自动保存和其他文档行为。

我也试过这个:

[[self.window standardWindowButton: NSWindowDocumentVersionsButton] setTitle:nil];

显示空白字符串而不是编辑,但短划线仍然出现 - 通常是分隔文档名称和编辑的字符串。

知道如何从文档中撬开窗口的这一部分吗?

3 个答案:

答案 0 :(得分:6)

有几个选择:

  1. 要获取指向“破折号”的指针,请在[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
    
  2. 您可以覆盖NSWindow的-setRepresentedURL:。这也会影响NSWindowDocumentIconButton和弹出菜单,但如果需要,可以手动创建它:[NSWindow standardWindowButton:NSWindowDocumentIconButton]。

  3. 覆盖这三个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推荐的,因为它通常由操作系统错误处理程序使用。

我添加了这个答案,因为其他答案都没有让我走上正确的道路。