扫描了所有类似问题并尝试了所有可能的解决方案后,我仍无法找到解决方案。我试图在我的 MapView 上添加多个引脚,但似乎我的引脚无法正常添加。我在 viewDidLoad 方法中启动了 NSTimer ,这样每隔5秒,一些更新的引脚就会放在Map上。我添加了调试信息,发现问题是方法viewForAnnotation没有被调用。 (我已经通过调用 [_ map setDelegate:self] 来设置代理人了
我的代码如下:
- (void)viewDidLoad
{
[super viewDidLoad];
_map = [[MKMapView alloc] initWithFrame:[[self view] frame]];
[_map setDelegate:self];
CLLocationCoordinate2D startLocation;
startLocation.latitude = [startLat floatValue];
startLocation.longitude = [startLong floatValue];
MKCoordinateSpan span = MKCoordinateSpanMake(0.002, 0.002);
MKCoordinateRegion region = MKCoordinateRegionMake(startLocation, span);
[_map setRegion:region];
[[self view] addSubview:_map];
[self getPlacesForLocation:[_map centerCoordinate]];
NSTimer *currentTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(theActionMethod:) userInfo:nil repeats:YES];
[currentTimer fire];
}
getPlacesForLocationMethod:
-(void)getPlacesForLocation:(CLLocationCoordinate2D)location
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^
{
/* get data from the website
** get the geo information and put them in the MapPin struct
*/
[self putPinsOnMap];
}
}
putPinsOnMap:
-(void)putPinsOnMap
{
for(Pinfo *iter in [_PinfoArray copy])
{
MapPin *pin = [[MapPin alloc] init];
[pin setTitle:[iter from_user_name]];
[pin setSubtitle:[iter text]];
[pin setCoordinate:[iter location]];
//NSLog(@"The coordinate is %f %f", [pin coordinate].latitude, [pin coordinate].longitude);
[_map addAnnotation:pin];
/****************************************/
NSLog(@"Try to put the pin on Map");
/****************************************/
}
}
以下是 MapPin.h 的内容:
@interface MapPin : NSObject<MKAnnotation>
@property (nonatomic, copy) NSString *title, *subtitle;
@property (nonatomic) CLLocationCoordinate2D coordinate;
@end
如果我留在原地,那么每次调用(void)putPinsOnMap 时,它会打印“尝试将图钉放在地图上”,但 viewForAnnotation 方法没有被调用(我还在那里添加了调试信息,但没有打印出来)。只有少数几次,如果我在很大程度上缩小,有时会调用 viewForAnnotation 方法。
答案 0 :(得分:1)
您说您向viewForAnnotation添加了调试信息,但是您没有将MKMapView子类化以覆盖viewForAnnotation方法(或者至少,您正在分配MKMapView,而不是任何子类)。我认为您正在寻找委托方法:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
如果您在视图控制器中实现该方法(您正在制作MKMapView的委托),那么您可能会获得有用的信息。
如果mapView:viewForAnnotation:仍然没有被调用,除非您缩小方向,那么您可能错误地放置了注释,它们只是在地球的其他部分上,而不是您最初在屏幕上的那个。< / p>