Ios Xcode中plist的地图标注?

Ios Xcode中plist的地图标注?,ios,ios4,mapkit,mkmapview,plist,Ios,Ios4,Mapkit,Mkmapview,Plist,我正在看下面关于一个问题的讨论,试图了解如何从plist读取位置,并相应地在地图视图中放置图钉: 我在理解如何使这项工作时遇到问题。如果我在注释中硬编码,那么我可以使它正常工作,这样我就不知道哪里出错了。我想这可能是我访问.plst中数据的方式。我的plist具有以下结构: <array> <dict> <key>rowData</key> <array> <dict>

我正在看下面关于一个问题的讨论,试图了解如何从plist读取位置,并相应地在地图视图中放置图钉:

我在理解如何使这项工作时遇到问题。如果我在注释中硬编码,那么我可以使它正常工作,这样我就不知道哪里出错了。我想这可能是我访问.plst中数据的方式。我的plist具有以下结构:

<array>
<dict>
    <key>rowData</key>
    <array>
        <dict>
            <key>details</key>
            <string>Some minor info</string>
            <key>latitude</key>
            <strong>53.958756</string>
            <key>Location</key>
            <string>Location One</string>
            <key>lontitude</key>
            <string>-1.07937</string>
        </dict>
       </array>
   </dict>
 </array>
我的viewDidLoad与我上面提到的另一个问题看起来也有点不同。看起来是这样的:

- (void)gotoLocation
{
    // set location as York, UK
    MKCoordinateRegion newRegion;
    newRegion.center.latitude = 53.960025;
    newRegion.center.longitude = -1.082697;
    newRegion.span.latitudeDelta = 0.0012872;
    newRegion.span.longitudeDelta = 0.0159863;

    [self.map setRegion:newRegion animated:YES];
}



 - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.


    //Set up map
    self.map.mapType = MKMapTypeStandard;   // also MKMapTypeSatellite or MKMapTypeHybrid

    [self gotoLocation];

    // Get the the plist in application bundle
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Places" ofType:@"plist"];

    // Retrieve the plists root element array
    NSArray *array = [[NSArray alloc] initWithContentsOfFile:path];
    NSLog(@"Grabbed locations.plist ok");

    if (array) {

        NSMutableDictionary* myDict = [NSMutableDictionary dictionaryWithCapacity:[array count]];
        for (NSDictionary* dict in array) {
            MapAnnotations* annotation = [[MapAnnotations alloc]initWithDictionary:dict];
            [self.map addAnnotation:annotation];
            [annotation release];
        }
        NSLog(@"The count: %i", [myDict count]);
    }

    else {
        NSLog(@"Plist does not exist");
    }

}
如果有人能向我解释我哪里出了问题,以及如何做我需要做的事情,我将不胜感激


谢谢你的阅读

首先,plist有几个问题(至少在您问题中的示例中):

  • (在
    纬度
    键下)应为
  • lontitude
    应该是
    经度
接下来,plist结构是一个数组,其中包含一个字典和一个键“rowData”,其值是一个字典数组。但是代码通过
array
变量循环,该变量仅包含最外层的数组(仅包含带有“rowData”键的单个字典)。因此,在
initWithDictionary
中,
objectForKey
调用all返回nil,因为与位置相关的键不在最外层的字典中

您希望重新构造plist,使其只是一个位置字典数组(消除“rowData”字典),或者更新代码以获取“rowData”键内的数组并循环:

NSArray *rowDataArray = [[array objectAtIndex:0] objectForKey:@"rowData"];
for (NSDictionary* dict in rowDataArray) //instead of "in array"

最后,
myDict
字典没有被真正使用。其计数的NSLog将始终显示为零,因为
dictionaryWithCapacity
行只分配内存,但不添加任何对象。我不认为有必要使用
myDict
变量,我会删除它。

非常感谢@Anna解决了我的问题。由于我仍在努力让我的头脑与plists一起工作,我想知道你是否能为我澄清一点?看看上面的例子,当使用plist时,我不需要一层一层地遍历它来获得我需要的数据,我可以只针对plist的一个特定方面,然后再进行操作?因此,如上所述,我可以直接进入行数据,而不是先定位根字典,然后定位下一个数组,再定位下一个字典,使用键值编码(请参见和)进行“直接访问”,但工作量可能大致相同。这样或那样,您必须了解plist结构并深入到所需的对象。正如我提到的,在您的例子中,甚至不需要外部数组和带有单个rowData键的字典。您只需要位置字典的内部数组,它将允许您使用原始代码。谢谢2Anna。之所以采用这种结构,是因为我使用相同的数据来填充表,并且我需要这种特定的结构。上面发布的plist是一个较大列表的片段。我对硬编码对象使用了键值编码,因此我比plists更熟悉它们,尽管我正在尝试学习更多关于编码的知识,因此plists提供了更多的学习曲线。
NSArray *rowDataArray = [[array objectAtIndex:0] objectForKey:@"rowData"];
for (NSDictionary* dict in rowDataArray) //instead of "in array"