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. svnフォルダをある場所から別の場所に移動する方法
- 2. サーブレットにファイルの場所を伝える適切な方法は何ですか?
- 3. LoginFormを別の場所に移動する方法
- 4. 春ブーツ - HTMLファイルの適切な場所
- 5. oAuth2 clientId&clientSecretの適切な場所
- 6. コントローラの作成方法を適切に呼び出す方法/場所
- 7. ウェブサーバ上のファイルシステムにイメージを保存する場所
- 8. cocos2dの特定の場所でオブジェクトを移動する方法
- 9. 分散ファイルシステム上でのファイルの移動
- 10. Springブートプロジェクトに静的リソースを配置する適切な場所
- 11. 移動中にAndroidの場所が更新される
- 12. UIDocumentのプレビューを保存する場所は?
- 13. SQLiteをある場所から別の場所に移動する:アプリケーションがクラッシュし、互換性のないタイプ
- 14. モデルビューで新しいウィンドウを表示するのに最適な場所ViewModel
- 15. Magento module追加のファイルを置くのに適切な場所
- 16. Phonegap geolocation.watchPositionがiPhone上の場所を更新しない
- 17. 私のsitecontentを適切な場所に設定してください。
- 18. Libgdx - 塗りつぶし矩形をscene2dの適切な場所に描画する方法は?
- 19. レコードを適切な方法で更新するには?
- 20. 場所を移動するプログラム
- 21. sails.jsのasestsと.tmpフォルダを移動して新しい場所から提供
- 22. railsモデルを名前空間に適切に移動する方法
- 23. Linux上で適切なバージョンのPHPを設定する方法
- 24. RSpecテストケースを適切な場所に置く
- 25. C++/OpenGLのオブジェクトを新しい場所に移動して古いオブジェクトを削除するには
- 26. MySqlCommandタイムアウトプロパティが適切な方法でCで動作しない#
- 27. SSISある場所から別の場所にデータを移動する
- 28. AngularJSコントローラのデータを更新する適切な方法
- 29. Vim - 前の場所に移動
- 30. Groovyメタクラスを適切に初期化する場所は?
これでも動作しますが、カプセル化に違反することなく移動する前にドキュメントを閉じることができない場合があります。 – Elland