0

plist ファイルのデータを NSMutableArray に解析しようとしています。

私のplistでは、ルートは6つの数字の配列を含む辞書です

IBOutlet UILabel *lbl4 オブジェクトにフックされたラベルを作成しました。このラベルに、plist を読み取って作成された配列の最初の要素を表示したいと思います。問題は、代入命令 (最後の命令) でプログラムがクラッシュすることです。私のコードはこれです:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
NSString *plistPath = [docPath stringByAppendingPathComponent:@"settings.plist"];

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

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
NSString *err = nil;
NSPropertyListFormat format;

NSDictionary *temp = (NSDictionary *) [NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&err];
if(!temp)
{
    NSLog(@"Error reading plist: %@, format: %d", err, format);
}

self.dataSet = [NSMutableArray arrayWithArray:[temp objectForKey:@"Dadi"]];
[lbl4 setText:[NSString stringWithFormat:@"%@", [dataSet objectAtIndex:0]]];

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>Dadi</key>
    <array/>
    <key>D4</key>
    <integer>0</integer>
    <key>D6</key>
    <integer>0</integer>
    <key>D8</key>
    <integer>0</integer>
    <key>D10</key>
    <integer>0</integer>
    <key>D12</key>
    <integer>0</integer>
    <key>D20</key>
    <integer>0</integer>
</dict>
</plist>

デバッグ出力には、「2012-09-02 18:29:55.483 Faith[6014:707] * キャッチされていない例外 'NSRangeException' が原因でアプリを終了しています。理由: '* -[__NSArrayM objectAtIndex:]: インデックス 0 が空の配列の境界を超えています。 」

4

1 に答える 1

1

あなたの plist では、辞書のDadiキーに格納されている配列が空です!

<key>Dadi</key>
    <array/>

そう

self.dataSet = [NSMutableArray arrayWithArray:[temp objectForKey:@"Dadi"]];

self.dataSet を空の配列に設定します (つまり、index:0 でさえ境界を超えています)。

この場合、se.f.dataSet.count == 0 を確認し、デフォルトを提供します。

@warrenm はコメントで、plist の構造が期待したものではないことを述べました。これらは XML ファイルであるため、 で終わるタグはすべて/>「自己終了」であるため、常にです。これらの数字を含めるには、終了タグを追加して内部に配置する必要があります。

<array>
  <integer>7</integer>
</array>

もちろん、さらに評価すると、既存の plist にはそれらに関連付けられたキーがあるため、これも適切なソリューションではない可能性があります。その plist に対するニーズを評価する必要があります。

于 2012-09-02T16:36:11.867 に答える