2011-11-27 12 views

Respuesta

5

Puede cambiar el nombre de un UIDocument cerrándolo primero y luego en el controlador de finalización, moviendo el archivo usando NSFileManager. Una vez que el archivo se ha movido con éxito, inicializar una nueva instancia de la subclase UIDocument utilizando la nueva dirección de fichero:

NSURL *directoryURL = [_document.fileURL URLByDeletingLastPathComponent];  
NSFileManager *fileManager = [[NSFileManager alloc] init];  
NSString *filePath = [directoryURL.path stringByAppendingPathComponent:@"NewFileName"]; 

[_document closeWithCompletionHandler:^(BOOL success) { 
    NSError *error; 

    if (success) 
     success = [fileManager moveItemAtPath:_document.fileURL.path toPath:filePath error:&error]; 

    if (success) { 
     NSURL *url = [NSURL fileURLWithPath:filePath]; 

     // I handle opening the document and updating the UI in setDocument: 
     self.document = [[MyDocumentSubclass alloc] initWithFileName:[url lastPathComponent] dateModified:[NSDate date] andURL:url]; 
    } else { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Unable to rename document" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; 
     [alert show]; 
     NSLog(@"Unable to move document: %@", error); 
    } 
}]; 
+0

Aunque esto funcionará, no siempre es posible cerrar el documento antes de moverlo sin violar la encapsulación. – Elland

-1

encontré esto en la especificación UIDocument clase (5.1):

Implementación de NSFilePresenter Protocolo

La clase UIDocument adopta el protocolo NSFilePresenter. Cuando otro cliente intenta leer el documento de una aplicación basada en UIDocument, esa lectura se suspende hasta que se le da la oportunidad al objeto UIDocument de guardar cualquier cambio realizado en el documento.

Aunque algunas implementaciones no hacen nada, UIDocument implementa todos los métodos NSFilePresenter. En concreto, UIDocument:

Implementa relinquishPresentedItemToReader: para reenviar el bloque entrante a .

Implementa relinquishPresentedItemToWriter: para comprobar si la fecha de modificación del archivo ha cambiado; si el archivo es más nuevo que antes, llama al revertToContentsOfURL:completionHandler: con el valor de fileURL como parámetro de URL.

Implementa presentedItemDidMoveToURL: para actualizar el URL del archivo del documento (fileURL).

En su subclase UIDocument, si anula un método NSFilePresenter, siempre puede invocar la implementación de la superclase (super).

que estaba buscando desesperadamente también y espero que el anterior ayuda. Aún no lo he probado, lo estoy haciendo ahora mismo.

Básicamente, si no me pierdo nada aquí, debe mover el documento usando NSFileManager y luego llamar al presentedItemDidMoveToURL: en su documento. Probablemente deba mover el archivo usando NSFileCoordinator, para asegurarse de que no tenga problemas.

Corrija todo lo que esté mal en esta respuesta. Sigo siendo n00b en todas esas cosas.

+1

Esta es la idea correcta, pero no creo que deba llamar 'presentedItemDidMoveToURL:' directamente, sino llamar a las notificaciones del coordinador de archivos. La razón principal es que puede tener abierto más de un presentador de archivo y llamar a los métodos de notificación garantizará que todos lo obtengan. – Elland

2

Esto podría ser viejo pero aún relevante.

Lo que se quiere hacer es la siguiente:

para mover: mover el archivo usando NSFileCoordinator, dentro del bloque del coordinador, llame

[fileCoordinator itemAtURL:URL willMoveToURL:toURL]; 
[fileManager moveItemAtURL:newURL toURL:toURL error:&moveError]; 
[fileCoordinator itemAtURL:URL didMoveToURL:toURL]; 

Para borrar: sobrescribir la subclase UIDocument o implementar el archivo método de protocolo del presentador accommodatePresentedItemDeletionWithCompletionHandler: para cerrar el documento.

- (void)accommodatePresentedItemDeletionWithCompletionHandler:(void (^)(NSError *))completionHandler; 
{ 
[self closeWithCompletionHandler:^(BOOL success) { 
    NSError *err; 
    if (!success) 
     err = [NSError error]; // implement your error here if you want 

    completionHandler(err); 
}]; 
} 

Asegurándose de que se moverá correctamente.

Cuestiones relacionadas