1

次のコードを使用して Resources plist ファイルをドキュメント ディレクトリにコピーします。

BOOL success;
NSError *error;

NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Test-Info.plist"];

success = [fileManager fileExistsAtPath:filePath];

if (!success) {
    NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingFormat:@"Test-Info.plist"];
    success = [fileManager copyItemAtPath:path toPath:filePath error:&error];
    NSLog(@"Test-Info.plist successfully copied to DocumentsDirectory.");
}

成功のメッセージが表示されます。これはすばらしいことです。ドキュメントフォルダーに正しくコピーされていると思います。

ただし、保存した plist ファイルを読み書きしようとすると、null が返されます。

Test-Info.plist のキー エントリ:

Key: EnableEverything
Type: Boolean
Value: YES

コードを書く:

NSString *adKey = @"EnableEverything";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
NSString *path = [documentsDirectoryPath stringByAppendingPathComponent:@"Test-Info.plist"];
NSMutableDictionary *plist = [NSDictionary dictionaryWithContentsOfFile: path];

NSString *enableEverything = [[plist valueForKey:adKey] stringValue];
NSLog(@"****** EXISTING: %@ ******", enableEverything); // returns (null)

// Disable in plist.
[plist setValue:0 forKey:adKey]; // will this work?
[plist writeToFile:path atomically:YES]; // this doesn't throw an error?

NSString *enableEverything1 = [[plist valueForKey:adKey] stringValue];
NSLog(@"****** NOW: %@ ******", enableEverything1); // returns (null)

出力:

****** EXISTING: (null) ******
****** NOW: (null) ******

私の質問は、(null)それらが plist ファイル内に存在するのはなぜですか?

4

2 に答える 2

2

不変オブジェクトを変更しようとしています。

NSMutableDictionaryが必要です。

IE

NSMutableDictionary *plist = [[NSDictionary dictionaryWithContentsOfFile: path] mutableCopy];

また、plist オブジェクトが nil でないかどうかも確認してください。これは、エラーを発生させずにメッセージを nil に送信できるためです。これは失敗せず、実際には何も起こりません。

[plist setValue:0 forKey:adKey]; // will this work?
[plist writeToFile:path atomically:YES]; // this doesn't throw an error?

ソース パスが nil であるため、コンパイルバンドル中にファイルをコピーしないようにします。ここにドラッグします:

ここに画像の説明を入力

于 2012-09-07T05:43:11.807 に答える
1

リソースの nsbundle パスにこれを試してください

NSString *path= [[NSBundle mainBundle] pathForResource:@"SportsLogo-Info" ofType:@"plist"];

割り当ててみてください

NSMutableDictionary *plist = [[NSMutableDictionary alloc] initWithDictionary:[NSDictionary dictionaryWithContentsOfFile:path]];

また、ファイルがコピーされているかどうかも確認してください。ライブラリに移動します=>アプリケーションサポート=>iPhoneシミュレータ=>シミュレータiOSのバージョンという名前のフォルダ=>アプリケーション=>プロジェクトの適切なフォルダを見つける=>ドキュメントにplistファイルがあるかどうかを確認します

于 2012-09-07T05:59:46.250 に答える