0

私は同様の問題を抱えている他の人々についてかなりの調査を行いましたが、彼らに提供された解決策は私の問題を解決できませんでした。エラー。

私の問題は、アプリケーションの永続的なデータ ストレージを確保するために追加した .plist ファイルが、プログラムで保存/ロードしようとすると見つからないことです。

私は持っている:

  • 私のプロジェクトのビルドフェーズタブの「バンドルリソースのコピー」の下にリストされていることを確認しました。
  • ファイルが /Users/Me/Library/Application Support/iPhone Simulator/5.1/Applications/Unique App ID/myapp.app フォルダーにコピーされていることを確認し、削除して再実行すると再び表示されます。
  • プロジェクトをクリーンアップして再構築しました

私のコードは、保存と読み込みが 2 つの異なる場所で行われるように構成されています。モーダル ビューが表示され、ユーザーがさまざまなデータ セットを選択できるようになると、読み込みが発生します。保存はアプリケーション デリゲート- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions関数で行われます。これらの関数の両方が呼び出されることを確認しましたが、その動作には完全に困惑しています。

開発者リソースの plist 記事に基づいて、かなり定型的なコードの保存と読み込みを行います。

- (void)applicationDidEnterBackground:(UIApplication *)application
{    
    NSDictionary *someDataToSave = [NSDictionary dictionaryWithObject:self.viewController.dataStorage forKey:@"myData"];

    NSString *error;
    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *plistPath = [rootPath stringByAppendingPathComponent:@"someData.plist"];
    plistPath = [rootPath stringByAppendingPathComponent:@"someData.plist"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
        plistPath = [[NSBundle mainBundle] pathForResource:@"someData.plist" ofType:@"plist"];
    }

    NSString *generatedName = [NSString stringWithFormat:@"DataSet - %s", [NSDate date]];

    NSDictionary *plistDict = [NSDictionary dictionaryWithObject:someDataToSave forKey:generatedName];
    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

    if(plistData)
        [plistData writeToFile:plistPath atomically:YES];
    else {
        NSLog(error);
    }
}

-(void)loadRecordsFromPList
{

    NSString *errorDesc = nil;
    NSPropertyListFormat format;
    NSString *plistPath;
    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    plistPath = [rootPath stringByAppendingPathComponent:@"someData.plist"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
        plistPath = [[NSBundle mainBundle] pathForResource:@"someData.plist" ofType:@"plist"];
    }

    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];

    if (!temp) {
        NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
    }

    self.myRecordsList = [NSMutableDictionary dictionaryWithDictionary:temp];    
}

私はデバッガーでさまざまなことを試すのに何時間も費やしましたが、微調整したものは何もありません。fileExistsAtPath は、明確な理由もなく一貫して null を返し、フォルダー内でファイルを見たにもかかわらず、ファイルが見つかりません。さらに、plist ファイルのみを含む単一のビュー アプリケーションと、上記と同じコードの 99% を使用するビュー コントローラーを作成しましたが、問題なく動作します。

どなたでもご協力いただければ幸いです。この時点で、考えられるすべてのことを試しました。

4

1 に答える 1

0

で、Documentsディレクトリにplistファイルがない場合は、メインバンドル内のパスにapplicationDidEnterBackground設定します。plistPath次に、plistファイルの書き込みに同じパスを使用します。つまり、アプリケーションのメインバンドルにあるplistファイルに辞書を書き込もうとします。

その場合にのみ、loadRecordsFromPList最初にDocumentsフォルダーを調べ、次にメインバンドルを調べるのが理にかなっています。データを保存するときは、常にドキュメントフォルダに保存する必要があります。

于 2012-08-23T20:53:30.583 に答える