2010-09-29 57 views
19

我想制作一张地图,在那里我可以看到我目前的位置,看看这条街叫什么名字。ViewForAnnotation不被称为

到目前为止,我可以在我的地图上放一个图钉,但由于某种原因,我没有收到标注。 和我已经在我的viewForAnnotation方法中放了一个NSLog,但它没有被调用,所以我无法测试它。

有人可以帮我吗?

-(void)lat:(float)lat lon:(float)lon 
{ 
    CLLocationCoordinate2D location; 
    location.latitude = lat; 
    location.longitude = lon; 
    NSLog(@"Latitude: %f, Longitude: %f",location.latitude, location.longitude); 
    //One location is obtained.. just zoom to that location 

    MKCoordinateRegion region; 
    region.center=location; 
    //Set Zoom level using Span 
    MKCoordinateSpan span; 
    span.latitudeDelta=.005f; 
    span.longitudeDelta=.005f; 
    region.span=span; 
    [map setRegion:region animated:TRUE]; 

    //MKReverseGeocoder *geocoder=[[MKReverseGeocoder alloc] initWithCoordinate:location]; 
    //geocoder.delegate=self; 
    //[geocoder start]; 
    if (cPlacemark != nil) { 
     [map removeAnnotation:cPlacemark]; 
    } 
    cPlacemark=[[CustomPlacemark alloc] initWithCoordinate:location]; 
    cPlacemark.title = mPlacemark.thoroughfare; 
    cPlacemark.subtitle = mPlacemark.locality; 
    [map addAnnotation:cPlacemark]; 
    [cPlacemark release]; 

    [mLocationManager stopUpdatingLocation]; 
} 

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 
if ([annotation isKindOfClass:[MKUserLocation class]]) 
    return nil; 

// try to dequeue an existing pin view first 
if ([annotation isKindOfClass:[CustomPlacemark class]]){ 
MKPinAnnotationView *pinView=(MKPinAnnotationView *)[map dequeueReusableAnnotationViewWithIdentifier:@"customIdentifier"]; 

if (!pinView) 
{ 
    // if an existing pin view was not available, create one 
    MKPinAnnotationView* cPinAnnoView = [[[MKPinAnnotationView alloc] 
              initWithAnnotation:annotation reuseIdentifier:@"customIdentifier"] autorelease]; 
    cPinAnnoView.pinColor = MKPinAnnotationColorPurple; 
    cPinAnnoView.animatesDrop = YES; 
    cPinAnnoView.canShowCallout = YES; 
    // Add button 
    UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    [leftButton addTarget:self action:@selector(annotationViewClick:) forControlEvents:UIControlEventTouchUpInside]; 
    cPinAnnoView.leftCalloutAccessoryView = leftButton; 

} else 
    { 
     pinView.annotation = annotation; 
    } 
    return pinView; 
} 
return nil; 

}

现在,我已经定制了自己的viewForAnnotation是这样。 但我仍然无法从我的引脚获得标注,并且引脚保持红色。 但它应该是什么都没有的紫色

+3

如果你的地图是从一个笔尖加载的,你记得把它连接起来吗?你记得设置代表吗? – 2010-09-29 12:32:25

+0

我的委托人“连线”到我的搜索栏和searchdisplaycontroller它现在正在工作:P感谢我仍然需要弄清楚为什么我没有得到标注 – Nico 2010-09-29 12:36:40

+0

你可以发布你的'CustomPlacemark'类吗?我看不出任何理由为什么这不起作用... – 2010-10-01 12:29:51

回答

5

难道是你的注释已被添加到MKMapView的当前视图区域之外吗?

+0

你看到的代码是我所有的注释 – Nico 2010-09-29 12:29:54

+1

我upvoted这是因为如果你认为你已经正确连线所有东西,请仔细检查你的经度和纬度值:也许你让它们颠倒过来,或者当它们应该是负数时,让它们中的一个(或两个)都为正。或者,在您的代码中,由于剪切/粘贴作业潦草,您在lat和lon都使用lat。 =) – UXUiOS 2014-08-04 16:43:11

7

为了获得viewForAnnotation被调用,请将mapView.delegate=self;添加到例如该viewDidLoad方法:

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    mapView.delegate=self; 
} 
+2

iOS 6(http://openradar.appspot.com/12346693)存在一个错误 - 如果您在添加注释之后设置委托,它们将获得默认注释视图,并且自定义mapView: viewForAnnotation不会被调用。 – vadimtrifonov 2013-08-19 21:46:20

32

我这是没有的MapView委托设置为文件所有者同样的问题。

  1. 打开你的笔尖
  2. 右键点击的MapView
  3. 拖动委托文件的所有者
+0

谢谢!这真的有用。 – 2012-04-26 17:19:25

+4

或者如果使用故事板 - CTRL单击MapView并拖动到橙色ViewController图标(在窗口正下方的黑条上) – Tim 2012-06-18 15:29:23

1

其他人已经解释,赔率是很高,你有没有连接你的MapView委托给你的控制器。它首先要检查

23

我有同样的问题,正如你所提到的。代表已被设置为ViewController,但viewForAnnotation选择器未被调用。一些检查后,我意识到,如果你没有在主线程中调用addAnotation,MapView的就不叫viewForAnnotation,所以以下更新解决了我的问题:

前:

[_mMapView addAnnotation:marker]; 

后:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [_mMapView addAnnotation:marker]; 
}); 
+0

您的回答确实解决了我的问题;) – JackieLam 2014-02-20 11:30:11

+0

这对我也有帮助。奇怪的是,它不是第一次工作,因为它在其他viewController中以'before'的方式工作。 :) – DevC 2014-08-14 08:30:58

+1

@DevC可能在其他地方你的代码运行在UI线程(又名主线程)。很高兴帮助:-) – 2014-08-14 14:43:48

2

对于故事板,Ctl将MKMapView拖动到ViewController底部栏上的橙色圆圈,然后选择委托。

这将解决问题。

1

正如评论中提到的vatrif,您必须设置您的代理之前添加批注到您的MKMapView对象。

0

我一直在ios 9 Mapview相关的应用程序工作,我遇到了同样的问题。

不知何故,我解决了我的问题,在我的情况下im调整mapview。 我在调整mapview的大小后添加了delegate。它现在完美的工作。

0

在设置了mapview的委托后,如果仍然没有调用viewforannotation,那么这是你错过的 - 在接口生成器中将self.mapView.showsUserLocation设置为YES,你可以在属性中勾选shows userLocation选项督察。