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