UIDocument
サブクラスを持つドキュメントベースの iOS アプリケーションがあります。ファイルシステム上でそれが表すファイルを移動できる必要があります。で移動することを検討しましたが、のプロパティNSFileManager
が台無しになります。この小さな難問を解決する方法についてのアイデアはありますか?UIDocument
fileURL
3 に答える
UIDocument の名前を変更するには、まず 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);
}
}];
UIDocument
クラス仕様(5.1)でこれを見つけました:
NSFilePresenter
議定書の実施
UIDocument
クラスはプロトコルを採用していますNSFilePresenter
。別のクライアントが に基づいたアプリケーションのドキュメントを読み込もうとすると、ドキュメントに加えられた変更を保存する機会がオブジェクトに与えられるUIDocument
まで、その読み取りは中断されます。UIDocument
何もしない実装もありますが、
UIDocument
すべてのNSFilePresenter
メソッドを実装します。具体的にはUIDocument
:
relinquishPresentedItemToReader:
着信ブロックを に転送するように実装しperformAsynchronousFileAccessUsingBlock:
ます。
relinquishPresentedItemToWriter:
ファイルの変更日が変更されたかどうかを確認するために実装します。ファイルが以前よりも新しい場合はrevertToContentsOfURL:completionHandler:
、の値をfileURL
URL パラメータとして呼び出します。
presentedItemDidMoveToURL:
ドキュメントのファイル URL ( ) を更新するために実装しますfileURL
。
UIDocument
サブクラスでメソッドをオーバーライドすると、いつNSFilePresenter
でもスーパークラスの実装を呼び出すことができます (super
)。
私もどうしようもなく探していましたが、上記がお役に立てば幸いです。私はまだテストしていません。
したがって、基本的に、ここで何も見逃していない場合は、 を使用してドキュメントを移動してから、ドキュメントをNSFileManager
呼び出す必要presentedItemDidMoveToURL:
があります。NSFileCoordinator
問題が発生しないようにするには、おそらく を使用してファイルを移動する必要があります。
間違っているこの回答のすべてを修正してください。私はまだそのすべてのものでn00bです。