Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 点击地图注释插脚时执行segue_Ios_Objective C_Ios7_Mkmapview_Mkannotation - Fatal编程技术网

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来避免该问题。