将UIDocument移动到文件系统上的新位置的正确方法是什么

时间:2011-11-27 07:00:13

标签: ios5 filesystems uikit nsfilemanager uidocument

我有一个基于文档的iOS应用程序,其中包含UIDocument个子类。我需要能够移动它在文件系统上表示的文件。我考虑使用NSFileManager移动它,但这会弄乱UIDocument的{​​{1}}属性。关于如何解决这个小难题的任何想法?

3 个答案:

答案 0 :(得分:5)

您可以通过先关闭它来重命名UIDocument,然后在完成处理程序中使用NSFileManager移动文件。成功移动文件后,使用新文件URL初始化UIDocument子类的新实例:

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);
    }
}];

答案 1 :(得分:4)

这可能很旧但仍然相关。

您想要做的是以下内容:

移动:使用NSFileCoordinator移动文件,在协调器的块内,调用

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

要删除:覆盖您的UIDocument子类或实现文件演示者协议方法accommodatePresentedItemDeletionWithCompletionHandler:以关闭文档。

- (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);
}];
}

从而确保它能够正确处理移动。

答案 2 :(得分:-1)

我在UIDocument类规范(5.1)中找到了这个:

  

NSFilePresenter协议的实施

     

UIDocument类采用NSFilePresenter协议。当另一个客户端尝试读取基于UIDocument的应用程序的文档时,该读取将暂停,直到UIDocument对象有机会保存对该文档所做的任何更改。

     

虽然某些实现什么都不做,但UIDocument实现了所有NSFilePresenter方法。具体而言,UIDocument

     
    

实现relinquishPresentedItemToReader:以将传入的块转发到performAsynchronousFileAccessUsingBlock:

         

实现relinquishPresentedItemToWriter:以检查文件修改日期是否已更改;如果文件比以前更新,则会调用revertToContentsOfURL:completionHandler:,并将fileURL的值作为网址参数。

         

实施presentedItemDidMoveToURL:更新文档的文件网址(fileURL)。

         

UIDocument子类中,如果覆盖NSFilePresenter方法,则始终可以调用超类实现(super)。

  

我也无可救药地寻找,我希望以上有所帮助。我还没有测试过 - 我现在就跳过它。

基本上,如果我在这里不遗漏任何内容,您必须使用NSFileManager移动文档,然后在文档上调用presentedItemDidMoveToURL:。您可能需要使用NSFileCoordinator移动文件,以确保不会出现问题。

请更正此答案中的所有内容。所有这些东西我仍然是 n00b