2012年2月14日火曜日

Plistから配列にする


アプリ上で使う要素を配列にする時にこんなコードは書いてないだろうか?

  NSMutableArray* array = [NSMutableArray alloc]init];
      [array addObject:@"Source1"];
      [array addObject:@"Source2"];
      [array addObject:@"Source3"];
            -----続く---------

もちろんこれでも間違いじゃないけれど、要素が100個くらいあると
しんどいしコードが長くなる。

そんな時はPlistを使って配列に起こすようにすると色々と楽だ

よくあるサンプルだと下記のようにやっているけれど、Xcode4.xにて作ったplistはこれじゃ読込めない。 試しに実行してみるとarrayWithContentsOfFileの戻り値がnilにて返ってくるはずだ。
    NSMutableArray* array = [[NSMutableArray alloc]init];
    NSBundle* bundle = [NSBundle mainBundle];
    NSString* path = [bundle pathForResource:@"list" ofType:@"plist"];
    NSArray* list = [NSArray arrayWithContentsOfFile:path];   
   
    for(NSString* str in list){
        [array addObject:str];
    } 

  
Plistがきちんとした形式になっていないとnilが返ってくる仕様だが、xcode上で作ったplistが読込めない。

Plistを右クリックしてSourceにて開いてみると。。。

一番頭のタグが<dict>になっている。

 下はXcode3.xにて作ったPlist。

  
頭のタグが<array>になってますね。

要するにXMLの階層構造がXcode4から変わっているってことです。
なので、 dictionaryWithContentsOfFile を使ってNSDictionaryを生成するのが正解。
まず、keyをきちんととれるように下記のようにplistを作りかえます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Root</key>
    <array>
        <string>要素1</string>
        <string>要素2</string>
    </array>
</dict>
</plist>



取得するコードは下記の通り。
一度 NSDictionaryにしてからobjectForKeyにて配列を取得するんですね。

    NSBundle* bundle = [NSBundle mainBundle];
    NSString* path = [bundle pathForResource:@"list" ofType:@"plist"];
    NSDictionary* dic = [NSDictionary dictionaryWithContentsOfFile:path];
    NSArray *items =[dic objectForKey:@"Root"];
   
    for(NSString* str in items){
        [array addObject:str];
    }

plistの作りようでは、配列の中にdictionaryを入れてそこからモデルオブジェクトを格納した配列にするなんてこともできちゃいます♪


0 件のコメント:

コメントを投稿