学习iOS MapKit - 来自NSDictionary的地图上的多个图钉

时间:2012-03-22 20:34:17

标签: ios mapkit

尝试获取包含我所有位置,标题和副标题的NSSDictionary并通过它们进行枚举并将它们添加到我的mapView中。第一部分似乎很好;我阅读了Plist并可以访问各个部分。我遇到的问题是通过枚举。

要求标题的NSLog正确地将该属性报告给控制台。

最后,我看到没有针脚。另外,在NSLog调用之后:

NSLog(@"My %i annotations are: %@", self.mapView.annotations.count, self.mapView.annotations);

我得到回应:

"My 1 annotations are: (
    "<MKPointAnnotation: 0xd0151f0>" )

一个注释似乎只是一个内存位置。

我确信我做的事情既简单又错误,但我会感激任何帮助。我一整天都在寻找,看到一些似乎是答案的东西,但没有任何东西可以帮助我在这个特殊的结构。

提前谢谢你。

以下代码在主viewController中触发,第一个看到的方法是在ViewDidLoad的末尾调用。

-(void) loadUpLocations{

NSPropertyListFormat format;
NSString *errorDesc=nil;

//make path to plist in bundle
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"locations2" ofType:@"plist"];
//fill data object with contents of file
NSData *myData = [[NSData alloc] initWithContentsOfFile:plistPath];
myLocations=[NSPropertyListSerialization propertyListFromData:myData 
                                             mutabilityOption:NSPropertyListMutableContainersAndLeaves 
                                                       format:&format
                                             errorDescription:&errorDesc];
if (!myLocations) {
    NSLog(@"Error reading Plist: %@ format: %@", errorDesc,format);
}

myAnnotation=[[MKPointAnnotation alloc]init];

for (NSString *loc in myLocations) {
    NSDictionary *value =[myLocations objectForKey:loc];

    //NSLog(@"Loc is equal to: %@",loc);

    //loop through and make annotations

    myAnnotation.coordinate = CLLocationCoordinate2DMake(
                                      [[value objectForKey:@"latitude"] doubleValue],
                                      [[value objectForKey:@"longitude"] doubleValue]);
    myAnnotation.title = [value objectForKey:@"title"];
    myAnnotation.subtitle = [value objectForKey:@"subtitle"];

    NSLog(@"%@",myAnnotation.title);
    [self.mapView addAnnotation:myAnnotation];

}

NSLog(@"My %i annotations are: %@", self.mapView.annotations.count, self.mapView.annotations);
}

- (IBAction)zoomToLocation:(id)sender {


//set center for zoom
MKCoordinateRegion region;
region.center=CLLocationCoordinate2DMake(33.75070416856952, -84.37034368515015);;

//set level of zoom
MKCoordinateSpan span;
span.latitudeDelta=.03;
span.longitudeDelta=.03;
region.span=span;


[mapView setRegion:region animated:YES];
}

// This gets called every time an annotation is in the map view

- (MKAnnotationView *)mapView:mapView viewForAnnotation:annotation{
NSLog(@"in annotationsView");


MKPinAnnotationView *myPins=[[MKPinAnnotationView alloc]
                                 initWithAnnotation:annotation 
                                 reuseIdentifier:@"myPins"];
myPins.animatesDrop=YES;
return myPins;
}

1 个答案:

答案 0 :(得分:2)

这一行:

myAnnotation=[[MKPointAnnotation alloc]init];

当前位于创建注释的for循环之外,因此只有一个对象被实例化,并且您不断修改该实例。

将该行移动到for循环内部(例如,在设置坐标的行上方)。


另外,如果您不使用ARC,请在[myAnnotation release];行之后添加addAnnotation