0

アプリで一連のコードを使用して Plist ファイルを読み取りますが、奇妙な動作が発生します。コードの例を次に示します。

//init loading from PLIST here, and then associate value.
NSString *pathString=[NSString stringWithFormat:@"%@Levels",targetWorld];
NSString *path = [[NSBundle mainBundle] pathForResource:pathString ofType:@"plist"];
NSString *levelNameNumber = [[NSString alloc] initWithFormat:targetLevel];

NSDictionary *levelsList = [[NSDictionary alloc] initWithContentsOfFile:path];
NSDictionary *level = [levelsList objectForKey:levelNameNumber];

NSEnumerator *levelFormations = [level objectEnumerator];

for( NSDictionary *worldSize in levelFormations )
{
    worldWidth = [[worldSize objectForKey:@"width"] intValue];
    worldHeight = [[worldSize objectForKey:@"height"] intValue];

    NSLog(@"height is %d",worldHeight);
    NSLog(@"width is %d",worldWidth);

}

[levelNameNumber release];
[levelsList release];

示されているように、値を監視するために NSLog を設定しました。ここにログがあります

2012-05-09 21:14:38.313 CapNTail[361:10a03] height is 344
2012-05-09 21:14:38.315 CapNTail[361:10a03] width is 123
2012-05-09 21:14:38.324 CapNTail[361:10a03] height is 0
2012-05-09 21:14:38.326 CapNTail[361:10a03] width is 0

彼らは自分自身をゼロにリセットしているようです。これまでのところ、両方のログが2回印刷されているため、forループが原因である可能性があります(2番目のループを実行してリセットするようです)。

私の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>level1</key>
<dict>
    <key>worldSize</key>
    <dict>
        <key>width</key>
        <integer>123</integer>
        <key>height</key>
        <integer>344</integer>
    </dict>
    <key>formation</key>
    <dict>
        <key>playerPosX</key>
        <integer>0</integer>
        <key>playerPosY</key>
        <integer>0</integer>

    </dict>
</dict>

4

1 に答える 1

1

高速列挙と。を混同していNSEnumeratorます。

NSEnumeratorを使用しwhile ((object = [enumerator nextObject])) {、を使用してループするか、オブジェクトで高速列挙を使用しlevelます(を作成する必要はありませんNSEnumerator)。

後者の戦略(推奨)を試すには、次のように置き換えます。

NSEnumerator *levelFormations = [level objectEnumerator];

for( NSDictionary *worldSize in levelFormations )
{
    worldWidth = [[worldSize objectForKey:@"width"] intValue];
    worldHeight = [[worldSize objectForKey:@"height"] intValue];

    NSLog(@"height is %d",worldHeight);
    NSLog(@"width is %d",worldWidth);

}

と:

for( NSDictionary *worldSize in level )
{
    worldWidth = [[worldSize objectForKey:@"width"] intValue];
    worldHeight = [[worldSize objectForKey:@"height"] intValue];

    NSLog(@"height is %d",worldHeight);
    NSLog(@"width is %d",worldWidth);
}

それは動作しますか?

この質問も参照してください。

于 2012-05-09T13:50:48.910 に答える