UIDocument
サブクラスを持つ文書ベースのiOSアプリケーションがあります。ファイルシステム上で表現されているファイルを移動できる必要があります。私はNSFileManager
でそれを動かすことを考えましたが、これはUIDocument
のfileURL
プロパティを台無しにするでしょう。どのようにこの小さな難解を解決するための任意のアイデア?UIDocumentをファイルシステム上の新しい場所に移動する適切な方法
答えて
UIDocumentの名前を変更するには、まずUIDocumentを閉じてから、完了ハンドラでNSFileManagerを使用してファイルを移動します。
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):
実装のファイルが正常に移動された後は、新しいファイルのURLを使用して、UIDocumentのサブクラスの新しいインスタンスを初期化します
NSFilePresenter
プロトコル
UIDocument
クラスはNSFilePresenter
プロトコルを採用しています。別のクライアントがUIDocument
ベースのアプリケーションのドキュメントを読み取ろうとすると、UIDocument
オブジェクトにドキュメントに対する変更を保存する機会が与えられるまで、その読み取りは中断されます。一部の実装では何も行われませんが、
UIDocument
はすべてNSFilePresenter
メソッドを実装します。具体的には、UIDocument
:はに入ってくるブロックを転送する
relinquishPresentedItemToReader:
を実装します。
relinquishPresentedItemToWriter:
を実装して、ファイルの変更日が変更されたかどうかを確認します。ファイルが以前よりも新しい場合は、fileURL
の値をURLパラメータとしてrevertToContentsOfURL:completionHandler:
を呼び出します。
presentedItemDidMoveToURL:
を実装して、ドキュメントのファイルURL(fileURL
)を更新します。
UIDocument
サブクラスでは、NSFilePresenter
メソッドをオーバーライドすると、常にスーパークラスの実装(super
)を呼び出すことができます。
私も絶望的でした。私はまだそれをテストしていない - 私は今すぐそれにジャンプしています。
基本的に、ここで何も見逃していない場合は、文書をNSFileManager
で移動してから、ドキュメントにpresentedItemDidMoveToURL:
を呼び出す必要があります。あなたはおそらくNSFileCoordinator
を使用してファイルを移動して、問題がないことを確認してください。
この回答のすべてを間違って入力してください。私はまだそのすべてのものでn00bです。
これは正しいアイデアですが、 'presentItemDidMoveToURL:'を直接呼び出すのではなく、ファイルコーディネーターの通知を呼び出すべきだと思います。主な理由は、複数のファイルプレゼンターを開くことができ、通知メソッドを呼び出すことですべてのユーザーが確実に取得できます。 – Elland
これは古いかもしれませんが、それでも関連します。
何がやりたいことは以下の通りです:移動するための
:コーディネータのブロック内で、削除するために
[fileCoordinator itemAtURL:URL willMoveToURL:toURL];
[fileManager moveItemAtURL:newURL toURL:toURL error:&moveError];
[fileCoordinator itemAtURL:URL didMoveToURL:toURL];
を呼び出し、NSFileCoordinatorを使用してファイルを移動:あなたの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);
}];
}
このようにして、移動が正しく処理されるようにします。
- 1. 適切な場所に
- 2. マゼンタのページタイトルを新しい場所に移動する
- 3. C#私が欲しい場所に移動する方法
- 4. node_modulesを別の場所に正しく移動する方法
- 5. svnフォルダをある場所から別の場所に移動する方法
- 6. ブートストラップコンテナでコンテンツを移動する適切な方法
- 7. サーブレットにファイルの場所を伝える適切な方法は何ですか?
- 8. アンカータグがワードプレスの適切な場所に着いていない
- 9. mariadb移動システムデータベースを新しい場所に
- 10. ViewModelを適切な場所に配置してください
- 11. php header( "場所:home.php");私を適切にリダイレクトしない
- 12. LoginFormを別の場所に移動する方法
- 13. oAuth2 clientId&clientSecretの適切な場所
- 14. 春ブーツ - HTMLファイルの適切な場所
- 15. ウェブサーバ上のファイルシステムにイメージを保存する場所
- 16. リアクタがある場所から別の場所に移動しない
- 17. 状態値を格納するためのReduxの適切な場所/方法
- 18. コントローラの作成方法を適切に呼び出す方法/場所
- 19. ファイルを移動すると、元の場所に新しい場所を示すショートカットが作成されます
- 20. 動的なjavascriptで適切な場所にInnerHTMLを配置する
- 21. アップグレード中に移動先の場所を見つける方法
- 22. 最適化/移動を一般的な場所で行う
- 23. cocos2dの特定の場所でオブジェクトを移動する方法
- 24. レイキャストはオブジェクト上の適切な場所を検出しません
- 25. ClassNotFoundException:しかし、クラスが適切な場所にあります
- 26. 分散ファイルシステム上でのファイルの移動
- 27. Springブートプロジェクトに静的リソースを配置する適切な場所
- 28. プロジェクトが新しい場所に移動したときを検出する方法
- 29. UIDocumentのプレビューを保存する場所は?
- 30. Hadoop HDFSは適切な場所に圧縮します
これでも動作しますが、カプセル化に違反することなく移動する前にドキュメントを閉じることができない場合があります。 – Elland