没有调用didSelectAnnotationView

时间:2014-11-03 11:44:13

标签: ios swift mkannotationview

我想在点击后使用注释。我已经查看了Apple的文档并且用google搜索了但是我无法找到为什么这与应该如何完成有什么不同。 基本上;我没有得到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)
}

我已导入地图套件并包含地图视图委托。

6 个答案:

答案 0 :(得分:15)

要回答原始问题,didSelectAnnotationView很可能无法调用,因为未设置地图视图的delegate属性。另一个常见原因是注释的title是空白的。

在更新的问题中,引脚不会以viewForAnnotation的实施方式显示,因为它会创建MKAnnotationView但不会设置其image属性。 image的{​​{1}}属性默认为MKAnnotationView,因此引脚位于此处但不可见。

如果要显示标准红色引脚,请执行以下操作:

  • 根本不执行nil委托方法,地图视图默认显示红色图钉
  • 实施viewForAnnotation委托方法,然后创建viewForAnnotation,自动显示" pin"图像。

因此,要么将图钉MKPinAnnotationView设置为某个自定义图像:

image

或创建anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) anView.canShowCallout = true anView.image = UIImage(named:"CustomImage") // <-- add this line ,并可选择设置其MKPinAnnotationView

pinColor

答案 1 :(得分:6)

在我的情况下问题是我在YES中设置属性 canShowCallout ,所以如果你在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.

答案 2 :(得分:2)

我想将此添加为对GOrozco58答案的评论,但没有足够的声誉来评论。

如果 canShowCallout 设置为YES,

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

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

答案 3 :(得分:2)

在最新版本的Swift中,方法声明已经改变了:

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

到此:

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

答案 4 :(得分:1)

在我的情况下,我使用的是服装注释,并且由于custom注释的图像属性为空,因此未调用didSelectAnnotationView,因此我将其设置为图像并开始调用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;
}

答案 5 :(得分:0)

安娜关于未分配注释标题的建议是我的问题的解决方案。我花了一分钟来实现这一点,我在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)
}