2014-09-12 14 views
7

Ho una sottoclasse NSDocument che presenta un documento di testo dal disco. Sto cercando di farlo aggiornare automaticamente al rilevamento delle modifiche ai file sul disco. Ho sovrascritte -presentedItemDidChange come questo:Come posso disattivare l'autosalvataggio dell'avviso "Il file è stato modificato da un'altra applicazione"?

- (void)presentedItemDidChange 
{ 
    [super presentedItemDidChange]; 
    // Ignoring bundles and error-handling for the moment. 
    NSData *newData = [NSData dataWithContentsOfURL:self.presentedItemURL]; 
    self.textView.string = [[NSString alloc] initWithData:newData encoding:NSUTF8StringEncoding]; 
} 

L'interfaccia utente rinfresca bene quando il file viene modificato in un'altra applicazione. Il problema è, ho questa finestra quando si tenta di salvare il documento nella mia applicazione dopo che è stato modificato da un'altra applicazione:

Alert when saving externally modified document

I tipi di un'idea per cui questo accade (non so se sia corretto): L'ora di modifica del documento è successiva (perché modificata da un'altra applicazione) rispetto all'ultima versione salvata nella mia app. Ma posso notificare al sistema di autosalvataggio che ho fatto qualcosa con esso e lasciarlo andare via? O sto facendo qualcosa di sbagliato quando aggiorno il documento, e dovrei farlo in un altro modo per gestire correttamente le versioni dei documenti? Devo considerare il supporto di entrambe le applicazioni esterne o non supportare il salvataggio automatico.

Grazie in anticipo.

+0

Dai un'occhiata a configurePersistentStoreCoordinatorForURL: ofType: modelConfiguration: storeOptions: metodo di errore menzionato in questa pagina http://stackoverflow.com/questions/3872727/programmatically-save-causes-document-to-think-other-app- changes-doc-when-ree ope – Coder404

+0

Ho trovato quel post, ma non sto sovrascrivendo quel metodo nel mio caso, quindi non c'è nulla da eliminare. Inoltre, non impostando né 'setDocumentEdited:' né 'updateChangeCount:' risolve la finestra di dialogo. – uranusjr

risposta

2

risposta @ uranusjr mi ha indirizzato nella giusta direzione - solo revertDocumentToSaved: non era esattamente il posto giusto.

override func presentedItemDidChange() { 
    dispatch_async(dispatch_get_main_queue()) { 
     self.reloadFromFile() 
    } 
} 

func reloadFromFile() { 

    guard let fileURL = self.fileURL else { return } 

    do { 
     try revertToContentsOfURL(fileURL, ofType: "YOUR TYPE HERE IF NECESSARY") 
    } catch { 
     // TODO handle error 
     print(error) 
    } 
} 

Questo semplicemente ricarica il file. readFromURL(url:, ofType:) (o le varianti basate su NSData/file wrapper) viene richiamato e da qui è possibile ricreare le strutture dati.

1

Oggi sono incappato in una soluzione (finalmente). È possibile “barare” OS X in non avverte di questo ripristinando il documento (ma non il file stesso) prima di poter realmente aggiornare la struttura interna di dati:

// Somehow read the updated data. 
NSString *content = ...; 

// Revert the document. 
// This will discard any user input after the last document save, 
// so you might want to present some UI here, like an NSAlert. 
[self revertDocumentToSaved:self]; 

// Update the internal state. 
self.content = content; 

Ora OS X sarà felice quando si salva il documento.

Problemi correlati