我正在查看以下对问题的讨论,以尝试理解如何从plist中读取位置并相应地删除引脚视图:
MapKit based app crashing when loading from 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>
我尝试使用上面问题的答案中的代码来访问这些数据,但这并不快乐:
-(id)initWithDictionary:(NSDictionary *)dict{
self = [super init];
if(self!=nil){
coordinate.latitude = [[dict objectForKey:@"latitude"] doubleValue];
coordinate.longitude = [[dict objectForKey:@"longitude"] doubleValue];
self.title = [dict objectForKey:@"Location"];
self.subtitle = [dict objectForKey:@"details"];
}
return self;
我的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");
}
}
如果有人能向我解释我哪里出错了以及如何做我需要做的事情,我会很感激。
感谢阅读。
答案 0 :(得分:1)
首先,plist存在一些问题(至少在你的问题中有例子):
<strong>
(在latitude
键下)应为<string>
lontitude
应为longitude
接下来,你的plist结构是一个包含一个字典的数组,其中一个键是“rowData”,其值是一个字典数组。但代码循环遍历array
变量,该变量仅包含最外层的数组(仅包含带有“rowData”键的单个字典)。因此,在initWithDictionary
中,objectForKey
调用全部返回nil,因为与位置相关的键不在最外层字典中。
您想重新构造plist,以便它只是一个位置字典数组(消除“rowData”字典)或更新代码以获取“rowData”键内的数组并循环执行:< / p>
NSArray *rowDataArray = [[array objectAtIndex:0] objectForKey:@"rowData"];
for (NSDictionary* dict in rowDataArray) //instead of "in array"
最后,myDict
字典没有被使用。其计数的NSLog将始终显示为零,因为dictionaryWithCapacity
行只分配内存但不添加任何对象。我认为不需要myDict
变量 - 我会删除它。