2016-10-07 9 views
1

私のアプリケーションにはトップレベルの配列であるplistを読み込んでいます。配列が変更可能であることを確認するだけで十分ですか?plistから読み込まれたオブジェクトの可変バージョンを作成することは可能ですか?

self.plistData = [[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myDataSource" ofType:@"plist"]] mutableCopy]; 

配列の各要素には、それぞれ辞書が含まれています。

テーブルセルの選択に基づいて、私は、選択したインデックスで辞書の属性を変更しています:

[self.cellDescriptors[indexPath.section][indexOfTappedRow] setValue:@"YES" forKey: @"isSelected"]; 

私は辞書の値を変更しようとすると、私はエラー'-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object'を取得しています。このエラーは、plistによって読み込まれたNSDictionaryが不変である場合に意味があります。

plistからコンテンツを読み込む方法はありますか?また、配列や辞書が可変バージョンとして読み込まれていることを確認する方法はありますか?

+0

提供されているコードは不完全です。あなたはどこで使っていますか? - removeObjectForKey? –

+0

辞書/配列を通してどのように反復処理しているかのコードを表示できますか? –

+1

各サブレベルオブジェクトを可変バージョンに変換する "mutableCopy"のビルドはありません。 'mutableCopy'はそれが呼び出される最上位レベルでのみ行います。 – Larme

答えて

2

最も簡単な方法は、NSPropertyListSerializationを使用して、変更可能なコンテナを取得するための適切なオプションを渡すことです。

NSString *path = [[NSBundle mainBundle] pathForResource:@"myDataSource" ofType:@"plist"]; 
NSData *data = [NSData dataWithContentsOfFile:path]; 
NSMutableArray *array = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:nil error:nil]; 
self.plistData = array; 

理想的には、errorパラメータを利用すると、チェックの適切なエラーを行いますが、これはあなたを得る始めます。

このコードはplistを読み込んで可変配列を返し、含まれるすべての配列と辞書も変更可能です。

関連する問題