viewForAnnotation未被调用

时间:2013-03-18 21:28:42

标签: ios objective-c map annotations

扫描了所有类似问题并尝试了所有可能的解决方案后,我仍无法找到解决方案。我试图在我的 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 方法。

1 个答案:

答案 0 :(得分:1)

您说您向viewForAnnotation添加了调试信息,但是您没有将MKMapView子类化以覆盖viewForAnnotation方法(或者至少,您正在分配MKMapView,而不是任何子类)。我认为您正在寻找委托方法:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

如果您在视图控制器中实现该方法(您正在制作MKMapView的委托),那么您可能会获得有用的信息。

如果mapView:viewForAnnotation:仍然没有被调用,除非您缩小方向,那么您可能错误地放置了注释,它们只是在地球的其他部分上,而不是您最初在屏幕上的那个。< / p>