4

これについて他の同様の質問を調べましたが、実際には何も機能しませんでした。

Plistに辞書の1つのペア(オブジェクト/キー)のみを書き込むことができました(例:setObject:itemProperties [0] forKey [0])。しかし、すべてのオブジェクトとキーを追加したいと考えています。これまでのところ管理していません (エラーを返します)。何か助けはありますか?

 // Path to Documents Folder

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

if (![fileManager fileExistsAtPath: path])
{
    path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"items.plist"] ];
}

NSMutableDictionary *items;

if ([fileManager fileExistsAtPath: path])
{
    items = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
}
else
{
    // If the file doesn’t exist, create an empty dictionary
    items = [[NSMutableDictionary alloc] initWithCapacity:5];
}

// array of the item properties
NSArray *itemProperties = @[myItem.itemTitle, myItem.itemImage, myItem.itemPositionX, myItem.itemPositionY, myItem.itemHeight, myItem.itemWidth];

// Set the key values for each field    
NSArray *keys = @[@"Title", @"Image", @"PositionX", @"PositionY", @"Height", @"Width"];


[items setObject:itemProperties forKey:keys];

//Save dictionnary to Plist
[items writeToFile: path atomically:YES];

if (![items writeToFile:path atomically:YES]) {
    NSLog(@"Error with creating Plist");
}
4

2 に答える 2

18

書く内容をコントロールできないこともあります。たとえばnull、サーバーから取得した JSON オブジェクトを作成する場合、値を避けることはできません。

NSDataはこれらの「無効な」値と互換性があるため、これらの場合はNSArrayorNSDictionaryに変換するNSDataのが理想的な方法です。

書きます:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:jsonObject];
[data writeToFile:path atomically:YES];

読んだ:

NSData *data = [NSData dataWithContentsOfFile:path];
NSDictionary *jsonObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
于 2013-12-18T13:46:03.927 に答える
8

有効なキーと値を適切に使用していますか?

このメソッドは、ファイルを書き出す前に、含まれているすべてのオブジェクトがプロパティ リスト オブジェクト (NSData、NSDate、NSNumber、NSString、NSArray、または NSDictionary のインスタンス) であることを再帰的に検証し、すべてのオブジェクトがプロパティ リスト オブジェクトでない場合は NO を返します。結果のファイルは、有効なプロパティ リストではありません。

リファレンス : writeToFile:atomically:

于 2013-09-06T07:48:19.657 に答える