2012-04-27 8 views
6

¿Cómo evito que un título de ventana muestre "Editado" para un NSDocument que está sucio?Anulación de "Editado" en el título de la ventana para NSDocument

Estoy administrando guardar y autoguardarme, usando un servicio web, y simplemente no quiero la distracción en la barra de título. primordial

He intentado:

  • de -isDocumentEdited y -hasUnautosavedChanges siempre para volver NO NSDocument.
  • -[NSWindowController setDocumentEdited] para no hacer nada, o siempre para usar NO independientemente del valor real del parámetro.
  • -[NSWindowController synchronizeWindowTitleWithDocumentName] para no hacer nada.
  • -[NSWindow setDocumentEdited] para no hacer nada, o siempre para usar NO independientemente del valor real del parámetro.

En todos los casos, la barra de título sigue cambiando a Editado cuando realizo cambios en un documento guardado.

Si omito -[NSDocument updateChangeCount:] y -[NSDocument updateChangeCountWithToken:forSaveOperation:] para no hacer nada, puedo evitar que esto ocurra, pero también afecta el guardado, el autoguardado y otros comportamientos de documento.

También probé esto:

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

Eso muestra una cadena en blanco en lugar de editar, pero el guión todavía parecía - el que normalmente separa el nombre del documento y editadas.

¿Alguna idea de cómo separar esta parte de la ventana del documento?

Respuesta

6

varias opciones:

  1. para obtener un puntero a la "guión", busque un campo de texto en [window.contentView.superview.subviews] con un stringValue es igual a "-". Puede establecer su texto en una cadena vacía también.

    @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. Puede anular -setRepresentedURL de NSWindow :. Esto también afectaría a NSWindowDocumentIconButton y al menú emergente, pero puede crearlo manualmente si lo desea: [NSWindow standardWindowButton: NSWindowDocumentIconButton].

  3. Ignorar uno de los métodos indocumentados estos tres de 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

gracias, esto fue difícil de encontrar en google. – thamster

+0

Excelente solución. @noa deberías aceptar este. Es impresionante. Por cierto Ben-Uri, por anular te refieres a swizzle ¿verdad? – Noitidart

+0

Gracias. Sin swizzle Simplemente impleméntelos en su subclase NSDocument como se sugiere en el comentario anterior sobre cada prototipo de método. –

1

¿Ha intentado anular NSDocuments - (BOOL)hasUnautosavedChanges además de anular - (BOOL) isDocumentEdited?

+0

Es una buena idea. Sin embargo, después de guardar automáticamente, aparece Editado hasta que el usuario inicie explícitamente una operación Guardar, según el diseño de Apple. Dicho esto, lo probé de todos modos: tener tanto '-hasUnautosavedChanges' como' -isDocumentEdited' devuelve NO, de todos modos apareció Edited. – paulmelnikow

+0

Ok, esta fue mi única idea desafortunadamente. Supongo que eliminar NSDocument como base para la aplicación, y solo usar NSDocumentController, requeriría una reescritura importante de su aplicación. – thundersteele

+0

Eso es correcto. Reimplementar '-updateChangeCount:', '-updateChangeCountForToken: forSaveOperation:', '-isDocumentEdited' y' -hasUnautosavedChanges' puede ser factible, pero incluso eso parece drástico y potencialmente difícil de mantener. No contarle al documento sobre su ventana es otra posibilidad, pero de nuevo, drástica. – paulmelnikow

0

Aunque se trata de una respuesta tardía, usted fácilmente puede determinar lo que va a ser el título de la ventana del NSDocument anulando

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

en su NSWindowController y devuelva el título correspondiente.

Puede hacer eso que es posible redefinir la propiedad de su NSDocument:

- (NSString *)displayName 

pero esto es no recomendadas por Apple, debido a que se utiliza normalmente por los controladores de errores del sistema operativo.

Agregué esta respuesta, porque ninguna de las otras respuestas realmente me puso en el camino correcto.

Cuestiones relacionadas