6

我有一个带有UIDocument子类的基于文档的 iOS 应用程序。我需要能够在文件系统上移动它代表的文件。我考虑过用 移动它NSFileManager,但这会弄乱UIDocument' 的fileURL属性。关于如何解决这个小难题的任何想法?

4

3 回答 3

5

这可能是旧的,但仍然相关。

您想要做的是以下内容:

移动:使用 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);
}];
}

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

于 2013-08-21T12:06:33.477 回答
4

您可以通过首先关闭 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);
    }
}];
于 2012-01-21T16:12:43.023 回答
-1

我在UIDocument类规范(5.1)中发现了这一点:

NSFilePresenter协议的实施

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

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

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

实现relinquishPresentedItemToWriter:检查文件修改日期是否已更改;如果文件比以前更新,它会使用URL 参数revertToContentsOfURL:completionHandler:的值进行调用。fileURL

实现presentedItemDidMoveToURL:更新文档的文件 URL ( fileURL)。

在你的UIDocument子类中,如果你重写了一个NSFilePresenter方法,你总是可以调用超类的实现(super)。

我也在绝望地搜索,希望以上内容有所帮助。我还没有测试它——我现在就开始了。

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

请更正此答案中所有错误的内容。在所有这些事情上,我仍然是一个n00b 。

于 2012-03-21T16:32:09.080 回答