2012-04-27 19 views
6

Làm cách nào để ngăn tiêu đề cửa sổ hiển thị "Đã chỉnh sửa" cho một NSDocument bị bẩn?Ghi đè "Đã chỉnh sửa" trong tiêu đề cửa sổ cho NSDocument

Tôi đang quản lý lưu và tự lưu bản thân, sử dụng dịch vụ web và chỉ không muốn mất tập trung trong thanh tiêu đề.

Tôi đã thử trọng:

  • NSDocument của -isDocumentEdited-hasUnautosavedChanges luôn trở NO.
  • -[NSWindowController setDocumentEdited] để không làm gì hoặc luôn sử dụng NO bất kể giá trị thực của thông số.
  • -[NSWindowController synchronizeWindowTitleWithDocumentName] không làm gì cả.
  • -[NSWindow setDocumentEdited] không làm gì cả hoặc luôn sử dụng NO bất kể giá trị thực của thông số.

Trong mọi trường hợp, thanh tiêu đề vẫn thay đổi thành Đã chỉnh sửa khi tôi thực hiện thay đổi đối với tài liệu đã lưu.

Nếu tôi ghi đè -[NSDocument updateChangeCount:]-[NSDocument updateChangeCountWithToken:forSaveOperation:] để không làm gì cả, tôi có thể ngăn điều này xảy ra, nhưng nó cũng ảnh hưởng đến lưu, tự động lưu và các hành vi tài liệu khác.

Tôi cũng đã cố gắng này:

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

Đó hiển thị một chuỗi trống thay vì chỉnh sửa, nhưng dash vẫn xuất hiện - một trong đó thường tách tên tài liệu và biên soạn.

Bất kỳ ý tưởng nào về cách phân chia phần này của cửa sổ khỏi tài liệu?

Trả lời

6

Một số tùy chọn:

  1. Để có được một con trỏ đến "dash", hãy tìm một TextField trong [window.contentView.superview.subviews] với một stringValue tương đương với "-". Bạn cũng có thể đặt văn bản của nó thành chuỗi trống.

    @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. Bạn có thể ghi đè lên NSWindow'ssetsetRepresentedURL :. Điều này cũng sẽ ảnh hưởng đến NSWindowDocumentIconButton và trình đơn bật lên, nhưng bạn có thể tạo thủ công nó nếu bạn muốn bằng: [NSWindow standardWindowButton: NSWindowDocumentIconButton].

  3. Override một trong những phương pháp không có giấy tờ ba NSDocument của:

    // 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

cảm ơn người đàn ông này rất khó tìm trên google. – thamster

+0

Giải pháp tuyệt vời. @noa bạn nên chấp nhận điều này. Tuyệt vời của nó. Btw Ben-Uri, bằng cách ghi đè lên bạn có nghĩa là sự lộn xộn phải không? – Noitidart

+0

Cảm ơn. Không có sự lộn xộn. Chỉ cần thực hiện chúng trong lớp con NSDocument của bạn như được đề xuất trong chú thích ở trên mỗi nguyên mẫu phương thức. –

1

Bạn đã cố gắng ghi đè NSDocuments - (BOOL)hasUnautosavedChanges ngoài ghi đè - (BOOL) isDocumentEdited?

+0

Đó là một ý tưởng hay. Sau khi tự động lưu, mặc dù, Edited xuất hiện cho đến khi người dùng bắt đầu một cách rõ ràng một hoạt động Save, theo thiết kế của Apple. Điều đó nói rằng, tôi đã thử nghiệm nó anyway: có cả hai '-hasUnautosavedChanges' và' -isDocumentEdited' return NO, Edited xuất hiện anyway. – paulmelnikow

+0

Ok, đây là ý tưởng duy nhất của tôi không may. Tôi giả định rằng thả NSDocument làm cơ sở cho ứng dụng và chỉ sử dụng NSDocumentController, sẽ yêu cầu viết lại chính ứng dụng của bạn? – thundersteele

+0

Đúng vậy. Thực hiện lại '-updateChangeCount:', '-updateChangeCountForToken: forSaveOperation:', '-isDocumentEdited' và' -hasUnautosavedChanges' có thể khả thi, nhưng thậm chí điều đó có vẻ quyết liệt và có khả năng khó duy trì. Không nói cho tài liệu về cửa sổ của nó là một khả năng khác, nhưng một lần nữa, quyết liệt. – paulmelnikow

0

Mặc dù đây là một câu trả lời muộn, bạn có thể dễ dàng xác định những gì đang xảy đến là tiêu đề của cửa sổ NSDocument của bạn bằng cách ghi đè

- (NSString *)windowTitleForDocumentDisplayName:(NSString *)displayName 

trong NSWindowController của bạn và trả lại tên phù hợp.

Bạn có thể làm điều đó cũng bằng cách ghi đè tài sản của NSDocument của bạn:

- (NSString *)displayName 

nhưng đây là không khuyến cáo của Apple, bởi vì đó thường được sử dụng bởi các trình xử lý lỗi hệ điều hành.

Tôi đã thêm câu trả lời này, bởi vì không có câu trả lời nào khác thực sự đặt tôi trên đúng đường dẫn.