目标C地图视图委托给MKAnnotation的viewForAnnotation刚刚点击后调用

时间:2012-08-29 21:36:53

标签: objective-c mkmapview mkannotation

我有一个简单的地图视图。它有一个方法

-(void)loadAndDisplayPois{
NSLog(@"loadAndDisplayPois");
 if(mapView.annotations.count > 0)
     [mapView removeAnnotations:mapView.annotations];
self.pois = [self loadPoisFromDatabase];
NSLog(@"self.pois.count: %i", self.pois.count);
[mapView addAnnotations:self.pois];
NSLog(@"mapView.annotations.count: %i",mapView.annotations.count);}

此方法被调用,我确信在下载数据并将其保存到数据库之后,因为Log而调用该方法。在将数据保存到数据库[self.senderObj performSelector:@selector(loadAndDisplayPois)];之后执行处理下载的类其中senderObj是MapViewControlller。在我第一次点击后,pois数组中的计数记录显示为4。但是视图上没有注释,因为viewForAnnotation未被调用(数组中的一个注释(我的当前位置))。通过单击TEST按钮再次执行该方法后,显示地图上的所有内容。

viewForAnnotation之后调用viewWillAppear方法,然后点击TEST按钮。

这让我疯狂了2天。我不能再......了。

2 个答案:

答案 0 :(得分:0)

您不必手动调用viewForAnnotation,您必须指明显示地图的类是MKMapView的委托

.h

 @interface yourViewController : UIViewController<MKMapViewDelegate> 

编辑:

我在项目中使用了这段代码并为我工作:

- (void)updateAnnotations {
    if (self.mapView != nil && self.mapView.annotations != nil) {
        NSArray *annotationsCopy = [NSArray arrayWithArray:[self.mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(self isKindOfClass: %@)", [MKUserLocation class]]]];

        [self.mapView removeAnnotations:annotationsCopy];
    }

    for (int i = 0 ; i < [appDelegate.centrosComerciales count] ; i++) {
        CC *ccAct = (CC *)[appDelegate.centrosComerciales objectAtIndex:i];
        CMapPoint *mp = [[CMapPoint alloc] initWithCC:ccAct];
        [self.mapView addAnnotation:mp];
        [mp release];
    }
} 

我没有删除mapView.annotations,而是删除了注释的副本,没有用户位置注释。

在viewWillAppear上调用updateAnnotations方法。

它与您的代码非常相似,但我删除了annotationsCopy而不是直接删除mapView.annotations。

答案 1 :(得分:0)

好的,我把它缩小了。但我还是不明白。

if(mapView.annotations.count > 0)
    [mapView removeAnnotations:mapView.annotations];
self.pois = [self loadPoisFromDatabase];
[mapView addAnnotations:self.pois];

我通过按钮执行此代码,它可以工作。由另一个类调用的相同代码不起作用。 WHY ????

区别在哪里?