3

状況: ファイルを処理し、ユーザーがこれらのファイルを使用してさまざまな操作を保存、編集、開き、実行できるようにする iOS アプリがあります。ユーザーが独自のカスタム ドキュメントと一緒にアプリ (例: テンプレート) を開いたときに、ユーザーが参照できるようにいくつかの事前に作成されたドキュメントを用意できるようにしたいと考えています。

問題: ドキュメント (またはテンプレート ファイル) を作成し、ユーザーがアプリをインストールして起動した後 (およびそれ以前のすべての回) にドキュメント フォルダーに表示するにはどうすればよいですか?

背景: このドキュメント (アプリのドキュメント ディレクトリにインストールされるドキュメント) は、ユーザーではなく私が作成したものです。

これを行うには、バンドルに保存する必要があることを知っています。その後、アプリを初めて実行するときに、サイレント モードでドキュメント ディレクトリにコピーします。appDidFinishLaunchingWithOptions メソッドまたは viewDidLoad メソッドにコピーして、アプリが初めて実行されたかどうかを検出するロジックを作成する必要がありますか?

私のコード:このWebページ:http://textsnip.com/d35fbc     しかし、実行すると、「ファイルが[ドキュメントフォルダーに]存在しません」と常に表示され、コピー中であることがわかります。問題は、アプリのドキュメント フォルダーを調べると、そこには存在せず、まだバンドル内にあることです。

このコードでコピーしないのはなぜですか? これはどのように機能しますか?

4

2 に答える 2

5

実際、ファイルはアプリバンドルに追加し、アプリの起動時にサイレントコピーする必要があります。

次のコードは、テキストファイルがまだ存在しない場合は、バンドルの最上位からドキュメントディレクトリにコピーします。

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *txtPath = [documentsDirectory stringByAppendingPathComponent:@"txtFile.txt"];

if ([fileManager fileExistsAtPath:txtPath] == NO) {
    NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"txtFile" ofType:@"txt"];
    [fileManager copyItemAtPath:resourcePath toPath:txtPath error:&error];
}

このコードの唯一の欠点は、ユーザーがファイルを削除した場合、アプリを再度開くとすぐに再表示されることです。

于 2012-05-28T20:56:41.413 に答える
3

あなたが言ったように、それをアプリバンドルに含めます(プロジェクトに追加し、それがターゲットの一部であることを確認してください)。次に、次のような呼び出しでそのパスにアクセスできます。

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"MyTemplateDoc" 
                                                       ofType:@"extension"];

次に、それをアプリのドキュメント フォルダーにコピーします。

NSString *docPath = <a path in your documents folder>
NSError *error = nil;
[[NSFileManager defaultManager] copyItemAtPath:bundlePath 
                                        toPath:docPath 
                                         error:&error];
if (error) {
    // handle copy error.
}
于 2012-05-24T21:53:08.320 に答える