我有一个简单的地图视图。它有一个方法
-(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天。我不能再......了。
答案 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 ????
区别在哪里?