Tengo una aplicación de iOS basada en documentos con una subclase UIDocument
. Necesito poder mover el archivo que representa en el sistema de archivos. He considerado moverlo con NSFileManager
, pero esto arruinaría la propiedad UIDocument
de fileURL
. ¿Alguna idea sobre cómo resolver este pequeño enigma?Cuál es la forma correcta de mover un UIDocument a una nueva ubicación en el sistema de archivos
Respuesta
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);
}
}];
encontré esto en la especificación UIDocument
clase (5.1):
Implementación de
NSFilePresenter
ProtocoloLa clase
UIDocument
adopta el protocoloNSFilePresenter
. Cuando otro cliente intenta leer el documento de una aplicación basada enUIDocument
, esa lectura se suspende hasta que se le da la oportunidad al objetoUIDocument
de guardar cualquier cambio realizado en el documento.Aunque algunas implementaciones no hacen nada,
UIDocument
implementa todos los métodosNSFilePresenter
. 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 alrevertToContentsOfURL:completionHandler:
con el valor defileURL
como parámetro de URL.Implementa
presentedItemDidMoveToURL:
para actualizar el URL del archivo del documento (fileURL
).En su subclase
UIDocument
, si anula un métodoNSFilePresenter
, 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.
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
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.
- 1. ¿Cuál es la forma "correcta" de escribir Copiar/Mover/operador = trío en C++ 11?
- 2. ¿Cuál es la forma correcta de animar una vista de una coordenada a otra?
- 3. ¿Cuál es la mejor forma de mover archivos de un servidor a otro con PHP?
- 4. ¿Cuál es la forma correcta de redirigir?
- 5. forma correcta de mover un nodo arrastrando en javafx 2?
- 6. ¿Cuál es la forma correcta de pasar una excepción? (C#)
- 7. Mover la biblioteca de ayuda a una ubicación diferente
- 8. ¿Cuál es la forma correcta de degradar una gema?
- 9. La forma más rápida de mover archivos en un sistema Windows
- 10. ¿Cuál es la forma correcta de desconectar un MediaController?
- 11. Cuál es la forma correcta de cerrar una conexión TCP
- 12. ¿Cuál es la forma correcta de liberar memoria en C#
- 13. ¿Cuál es la forma correcta de cargar un ListBox?
- 14. ¿Cuál es la forma "correcta" de eliminar archivos de una instantánea de ClearCase?
- 15. phpdoc: ¿Cuál es la forma correcta de documentar una constante
- 16. ¿Cuál es la forma correcta de ocultar una etiqueta HTML?
- 17. ¿Cuál es la forma correcta de usar TypeForwardedToAttribute?
- 18. ¿Cuál es la forma correcta de agregar un módulo de utilidad a una distribución de CPAN?
- 19. ¿Cuál es la forma correcta de declarar un Doctype HTML5?
- 20. ¿Cuál es la forma correcta de usar bitfields en C?
- 21. cuál es la forma correcta de separar datos en couchbase
- 22. ¿Cuál es la forma correcta de cambiar el comportamiento de una etiqueta <a>?
- 23. ¿Cuál es la forma correcta de manejar eventos en C++?
- 24. ¿Cuál es la forma MVC de enviar un archivo simultáneamente y redirigir a una página nueva?
- 25. ¿Cuál es la forma correcta de verificar si un valor es una fecha/número en Delphi
- 26. ¿Cuál es la forma correcta de probar áreas en excepciones?
- 27. ¿Cuál es la forma correcta de '#include file' en MVC?
- 28. ¿Cuál es la forma correcta de usar un registrador en una clase Serializable de Java?
- 29. ¿Cuál es la forma correcta de rastrear índices en python?
- 30. ¿Cuál es la nueva forma correcta de utilizar un selector secundario con un nodo de contexto en jQuery?
Aunque esto funcionará, no siempre es posible cerrar el documento antes de moverlo sin violar la encapsulación. – Elland