2012-04-27 11 views
6

NSDocumentのウィンドウタイトルに「編集済み」と表示されないようにするにはどうすればよいですか?NSDocumentのウィンドウタイトルで "編集済み"を無効にします。

私はWebサービスを使用して、自分自身を保存して自動保存することを管理しています。タイトルバーに注意を払う必要はありません。

私が試したオーバーライド:

  • のNSDocumentの-isDocumentEdited-hasUnautosavedChanges常にNOを返すように。
  • -[NSWindowController setDocumentEdited]パラメータの実際の値に関係なく、何もしないでも、常にNOを使用することもできます。
  • -[NSWindowController synchronizeWindowTitleWithDocumentName]何もしません。
  • -[NSWindow setDocumentEdited]パラメータの実際の値に関係なく、何もしないでも、常にNOを使用することもできます。

保存されたドキュメントを変更すると、いずれの場合でもタイトルバーが[編集済み]に変わります。

-[NSDocument updateChangeCount:]-[NSDocument updateChangeCountWithToken:forSaveOperation:]を無効にすると、これは起こりませんが、保存、オートセーブなどのドキュメントの動作にも影響します。

は、私も試してみましたこの:代わりに、編集の空白文字列を表示しますが、ダッシュはまだ登場し
[[self.window standardWindowButton: NSWindowDocumentVersionsButton] setTitle:nil]; 

- 通常、文書名や編集を分けるものを。

ドキュメントのこの部分をどうやって覗くのか考えてみましょうか?

答えて

6

いくつかのオプション:

  1. のstringValueと[window.contentView.superview.subviews]で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 
    
+0

これはGoogleで見つけるのは大変でした。 – thamster

+0

優れたソリューション。あなたはこれを受け入れるべきです。それは素晴らしいです。 Btwベン - ウリ、オーバーライドであなたは右にうんざりを意味する? – Noitidart

+0

ありがとうございます。スウィズル。それぞれのメソッドプロトタイプの上のコメントに示唆されているように、NSDocumentサブクラスに実装するだけです。 –

1

- (BOOL) isDocumentEditedをオーバーライドするだけでなく、NSDocuments - (BOOL)hasUnautosavedChangesをオーバーライドしましたか?

+0

いい考えです。しかし、自動保存した後は、ユーザーが明示的に保存操作を開始するまで、Appleの設計によって[編集済み]が表示されます。つまり、私はとにかくテストしました。 '-hasUnautosavedChanges'と' -isDocumentEdited'の両方を返さなければ、とにかくEditedが現れました。 – paulmelnikow

+0

これは残念なことに私の唯一のアイデアでした。私は、NSDocumentをアプリケーションの基礎としてドロップし、NSDocumentControllerのみを使用すると、アプリケーションの大幅な書き換えが必要になると思いますか? – thundersteele

+0

そうです。 '-updateChangeCount:'、 '-updateChangeCountForToken:forSaveOperation:'、 '-isDocumentEdited'と' -hasUnautosavedChanges'を再実装することは可能かもしれませんが、それは劇的で、維持するのが難しいようです。そのウィンドウについてドキュメントを伝えていないことも別の可能性ですが、ここでも劇的です。 – paulmelnikow

0

これは後半の答えですが、あなたは簡単に

をオーバーライドすることで、あなたのNSDocumentウィンドウのタイトルであることを何が起こっているかを判断することができます
- (NSString *)windowTitleForDocumentDisplayName:(NSString *)displayName 

NSWindowControllerで、適切なタイトルを返します。

あなたはNSDocumentののプロパティをオーバーライドしているにも行うことができます

- (NSString *)displayName 

をそれは、通常、OSのエラーハンドラで使用されているので、これは、Appleが推奨さないです。

私はこの回答を追加しました。他の回答のどれも実際に正しい経路に私を置かなかったからです。

関連する問題