【问题标题】:performing segue when a map annotation pin is tapped在点击地图注释引脚时执行 segue
【发布时间】:2013-12-23 21:11:15
【问题描述】:

我正在尝试在点击地图注释图钉时执行转场。如果这会有所不同,我会使用自定义注释类。

我试过了

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {

    NSLog(@"annotation selected");

    [self performSegueWithIdentifier:@"mySegue" sender:self];
}

但是我的 NSLog 没有运行,所以我假设该方法没有被调用。

我所做的唯一其他事情是将注释引脚添加到我的地图视图并将我的视图控制器设置为地图视图委托。

这是我将注释添加到地图视图的方式

SPMapAnnotation *pin = [[SPMapAnnotation alloc] init];

pin.coordinate = spotLocation.coordinate;

pin.title = [spot objectForKey:@"spotName"];

[self.mapView addAnnotation:pin];

我怎样才能做到这一点? didSelectAnnotation 方法看起来很容易做到,但我不确定它是如何工作的。

【问题讨论】:

  • 您是否为上述方法设置了地图视图的委托?
  • @Idindu,是的 viewDidload 我有 self.mapView.delegate = self;
  • 您能告诉我们您是如何在地图视图中添加图钉注释视图的吗?
  • @idindu,编辑显示我如何将 pin 添加到 mapview
  • 你在你的视图控制器中实现了这个协议 MKMapViewDelegate 吗?

标签: ios objective-c ios7 mkmapview mkannotation


【解决方案1】:

显然我忘记了在 viewDidAppear 之前我没有分配我的 mapView。只需要添加

self.mapView.delegate = self;

在我分配并初始化它之后。

【讨论】:

  • 这很奇怪。在viewDidLoad 方法中设置委托应该可以正常工作。您确定 viewDidLoad 中的代码实际上正在执行吗?我在 cmets 中注意到您用小写字母“l”说“viewDidload”的问题。如果该方法真的是这样命名的,它就不会运行。此外,您无需为 didSelectAnnotationView 实施 viewForAnnotation 即可工作(正如其他答案所建议的那样)。
  • 是的,我确定它正在执行。它的名字也恰如其分。是的,我意识到我不需要实现 viewForAnnotation,因为我只是使用默认的注释视图。
  • @anna,我的错。我忘记了在视图出现之前我没有分配和初始化我的地图,在我分配和初始化它之后设置委托,它也可以正常工作。我认为这一直是导致问题的原因。所有的时间都浪费在试图弄清楚它就在我面前
  • 是的,可以这样做(在 viewDidLoad 中,mapView 属性仍然为零,因此在其上设置委托什么也没做)。但请注意,根据您呈现视图控制器的方式,可以多次调用 viewDidAppear(这可能会导致不必要地将多个地图视图对象添加到视图中)。例如:如果您从地图 vc 推送另一个 vc,然后弹出该 vc 以返回到地图 vc,则地图 vc 的 viewDidAppear 将再次被调用(但不是它的 viewDidLoad)。通常,你在 viewDidLoad 中 alloc+init+addSubview 来避免这个问题。
【解决方案2】:

实现以下委托方法

- (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; 
}

由于标准注解pin不会调用didSelectAnnotationView,所以需要返回MKAnnotationView才能调用didSelectAnnotationView。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多