Ios 点击地图注释插脚时执行segue
当点击地图注释引脚时,我正在尝试执行一个序列。如果有区别的话,我会使用自定义注释类 我试过了Ios 点击地图注释插脚时执行segue,ios,objective-c,ios7,mkmapview,mkannotation,Ios,Objective C,Ios7,Mkmapview,Mkannotation,当点击地图注释引脚时,我正在尝试执行一个序列。如果有区别的话,我会使用自定义注释类 我试过了 - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { NSLog(@"annotation selected"); [self performSegueWithIdentifier:@"mySegue" sender:self]; } 但是我的NSLog没有运行
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
NSLog(@"annotation selected");
[self performSegueWithIdentifier:@"mySegue" sender:self];
}
但是我的NSLog没有运行,所以我假设没有调用该方法
我唯一做的其他事情是将注释接点添加到地图视图,并将视图控制器设置为地图视图代理
下面是我如何将注释添加到mapview的
SPMapAnnotation *pin = [[SPMapAnnotation alloc] init];
pin.coordinate = spotLocation.coordinate;
pin.title = [spot objectForKey:@"spotName"];
[self.mapView addAnnotation:pin];
我怎样才能做到这一点?didSelectAnnotation方法似乎可以使这项工作变得简单,但我不确定它是如何工作的 实现以下委托方法
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
MKPinAnnotationView *annotationView = nil;
if ([annotation isKindOfClass:[SPMapAnnotation class]])
{
annotationView = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"Pin"];
if (annotationView == nil)
{
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"];
annotationView.canShowCallout = YES;
annotationView.animatesDrop = YES;
}
}
return annotationView;
}
-(MKAnnotationView*)地图视图:(MKMapView*)地图视图注释:(id)注释
{
MKPinAnnotationView*annotationView=nil;
if([annotation isKindOfClass:[SPMapAnnotation class]])
{
annotationView=(MKPinAnnotationView*)[self.mapView出列可重用annotationView,标识符:@“Pin”];
如果(注释视图==nil)
{
annotationView=[[MKPinAnnotationView alloc]initWithAnnotation:annotation重用标识符:@“Pin”];
annotationView.canShowCallout=是;
annotationView.animatesDrop=YES;
}
}
返回注释视图;
}
由于标准注释pin不会调用didSelectAnnotationView,因此您需要返回MKAnnotationView才能调用didSelectAnnotationView。显然,我忘记了在出现视图之前我没有分配地图视图。只是需要补充一下
self.mapView.delegate = self;
在我分配并初始化它之后 您是否已将上述方法的“地图视图”的委托设置为有效?@IDIDU,是的,在viewDidload中,我有self.mapView.delegate=self;你能告诉我们你是如何在地图视图中添加pin注释视图的吗?@IDIDU,编辑以显示我是如何在地图视图中添加pin的。你在视图控制器中实现了这个协议MKMapViewDelegate吗?这很奇怪。在
viewDidLoad
方法中设置委托应该可以正常工作。您确定viewDidLoad中的代码确实在执行吗?我注意到在对问题的评论中,你用小写字母“l”表示“viewDidload”。如果这个方法真的是这样命名的,它就不会运行了。另外,您不需要为didSelectAnnotationView实现viewForAnnotation(如另一个答案所示)。是的,我确信它正在执行。它的名字也很贴切。是的,我意识到我不需要实现viewForAnnotation,因为我只使用默认的注释视图。@anna,我的错误。我忘了在视图出现之前我没有分配和初始化我的映射,在分配和初始化它之后设置委托,它也可以工作。我想这就是问题的根源。所有这些时间都浪费在试图弄明白这一点上,而正是在meYes面前完成的(在viewDidLoad中,mapView属性仍然为零,因此在其上设置delegate没有任何作用)。但请注意,根据视图控制器的显示方式,可以多次调用ViewDidDisplay(这可能会导致不必要地将多个地图视图对象添加到视图中)。例如:如果您从map vc推送另一个vc,然后弹出该vc返回map vc,则map vc的ViewDidDisplay将再次被调用(但不会调用其viewDidLoad)。通常,您可以在viewDidLoad中alloc+init+addSubview来避免该问题。