未调用 didSelectAnnotationView

Posted

技术标签:

【中文标题】未调用 didSelectAnnotationView【英文标题】:didSelectAnnotationView not called 【发布时间】:2014-12-30 01:41:16 【问题描述】:

我想在单击注释后使用它。我已经在 Apple 的文档中进行了查找,并且确实进行了谷歌搜索,但我找不到为什么这与应该如何完成有任何不同。 基本上;我没有收到println("Pin clicked");

为什么不呢?

    func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!

    if !(annotation is MKPointAnnotation) 

        return nil
    

    let reuseId = "test"

    var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
    if anView == nil 
        anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        anView.canShowCallout = true

    
    else 
        anView.annotation = annotation
    

    return anView

func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)

    println("Pin clicked");

func setAnnotationPinOnMap(annotation : NSManagedObject)


    var subject: AnyObject? = annotation.valueForKey("subject")
    var desc: AnyObject? = annotation.valueForKey("desc")
    var langitude: AnyObject? = annotation.valueForKey("langitude")
    var longitude: AnyObject? = annotation.valueForKey("longitude")
    println(annotation);
    let pin = MKPointAnnotation()

    let location = CLLocationCoordinate2D(
        latitude: longitude as CLLocationDegrees,
        longitude: langitude as CLLocationDegrees
    )
    println(location.longitude, location.latitude)
    pin.setCoordinate(location)
    pin.title = subject as String!
    pin.subtitle = desc as String!
    println( pin.coordinate.longitude)
    viewForAnnotation(pin);
    mapView.addAnnotation(pin)

我已导入地图工具包并包含地图视图委托。

【问题讨论】:

地图视图的delegate属性设置了吗?如果不是,则不会调用委托方法。还要确保注解的title(设置为subject)不是空白或nil。 两个不相关的事情:1)设置location时,纬度设置为经度,经度设置为看起来向后的经度。 2) 编写的 viewForAnnotation 函数毫无意义。它返回一个视图,但代码对它没有任何作用,并且 它没有正确命名为地图视图的委托方法。它必须命名为func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!,并且必须设置地图视图的delegate。你不应该直接调用它。 我认为我没有设置地图视图的委托。我现在将其设置为:mapView.delegate = self.现在,没有显示图钉(以前显示图钉,只是没有引发点击事件) 你实现了 mapView(mapView:viewForAnnotation:) 方法吗?如果你这样做了,把它注释掉,看看针脚是否显示。 如果我评论 mapView viewforannotation 功能,它会显示引脚。我用当前版本的 viewforannotation 更新了主帖。 【参考方案1】:

为了回答最初的问题,didSelectAnnotationView 很可能没有被调用,因为未设置地图视图的 delegate 属性。另一个常见原因是注释的title 为空白。

在更新后的问题中,引脚不会以 viewForAnnotation 的实现方式显示,因为它创建了一个 MKAnnotationView 但未设置其 image 属性。 MKAnnotationViewimage 属性默认为 nil,因此引脚存在但不可见。

如果你想显示标准的红色图钉,要么:

根本不实现viewForAnnotation 委托方法,地图视图将显示红色引脚默认情况下。 实现viewForAnnotation 委托方法并创建一个MKPinAnnotationView,而不是自动显示“图钉”图像。

所以要么将 pin 的 image 设置为一些自定义图像:

anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
anView.canShowCallout = true
anView.image = UIImage(named:"CustomImage")  // <-- add this line

或者创建一个MKPinAnnotationView,并选择设置它的pinColor

var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
if anView == nil 
    anView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
    anView!.canShowCallout = true
    anView!.animatesDrop = true
    anView!.pinColor = .Purple  // or Red or Green

else 
    anView!.annotation = annotation

【讨论】:

嗨,安娜,非常感谢您提供如此出色的答案。我的问题(正如您正确指出的那样)是我没有为视图设置标题。如果我不想设置标题怎么办?还有其他选择吗? 弗拉德,您找到问题的答案了吗?我还想制作一个包含标签的自定义视图。问题是,如果我设置标题,它会出现在我的视图中,但也出现在右侧,在我的自定义视图旁边 空白标题为我修复了它。更具体地说,我不小心删除了“- (NSString *)title;”我的 .h 文件中的声明。【参考方案2】:

在我的情况下,问题是我将属性 canShowCallout 设置为 YES,所以如果您将此属性设置为 YES

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

没有被调用。当我删除此属性时,该方法被调用。

annotationView = [[ClusterAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
annotationView.canShowCallout = YES; //try setting to NO or don't set.

【讨论】:

canShowCallout = false for Swift 为我解决了这个问题。谢谢:)【参考方案3】:

在最新版本的 Swift 中,方法声明已从以下更改:

func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)

到这里:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) 

【讨论】:

【参考方案4】:

我想将此作为评论添加到 GOrozco58 答案,但没有足够的声誉发表评论。

如果您将 canShowCallout 设置为 YES,

GOrozco58 是正确的,如果标题为 nil,则不会调用 didSelectAnnotation

如果您希望调用 didSelectAnnotation 并将 canShowCallout 设置为 YES,请确保添加标题。

【讨论】:

然后让你得到一些代表!【参考方案5】:

在我的例子中,我使用了服装注释并且没有调用 didSelectAnnotationView,因为 custome 注释的 image 属性为空,所以我将其设置为 image 并开始调用 didSelectAnnotationView。

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    if (self != nil)
    
        DoctorCustomeAnnotation *mapItem = (DoctorCustomeAnnotation *)self.annotation;

        // offset the annotation so it won't obscure the actual lat/long location
        self.centerOffset = CGPointMake(100, 100.0);
        self.backgroundColor = [UIColor redColor];
        PAImageView* avatarView = [[PAImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)
                                             backgroundProgressColor:[UIColor whiteColor]
                                                       progressColor:[UIColor colorWithRed:0.092 green:0.383 blue:0.580 alpha:1.000]];
        [self addSubview:avatarView];
        self.image = [UIImage imageNamed:@"placeholder_male"];
        [avatarView setImageURL:@"http://www.straine.com/wp-content/uploads/2015/12/doctor.png"];
    
    return self;

【讨论】:

【参考方案6】:

Anna 提出的未分配注释标题的建议是解决我的问题的方法。我花了一分钟来实现这个,我在gestureRecognizer() 函数中做到了。这是我的例子:

    @objc func handleLongPress(_ gestureRecognizer : UIGestureRecognizer) 
    if gestureRecognizer.state != .began  return 
    print("Tap gesture recognized")

    // Create the annotation
    let touchPoint = gestureRecognizer.location(in: mapView)
    let newCoordinate = self.mapView.convert(touchPoint, toCoordinateFrom:self.mapView)
    let annotation = MKPointAnnotation()
    annotation.coordinate = newCoordinate
    annotation.title = "placeholder"

    // Add the annotation
    mapView.addAnnotation(annotation)

【讨论】:

以上是关于未调用 didSelectAnnotationView的主要内容,如果未能解决你的问题,请参考以下文章

numberOfRowsInSection 已调用但 cellForRowAt 未调用

调用 textFieldShouldBeginEditing,未调用 textFieldDidBeginEditing

JQuery:未捕获的类型错误:无法读取未定义的属性“调用”

调用结果未使用

C# Web Api 调用未从 jquery 调用

未调用 cellForRowAtIndexPath 但调用 numberOfRowsInSection