ios - 如何判断在 calloutAcessoryControlTapped 中按下了哪个按钮?

标签 ios mkmapview mkannotation mkannotationview

我正在使用 MapKit,我的图钉中有 2 个标注配件。

我正在尝试实现一个用于更新图钉标题的按钮和一个用于删除图钉的按钮。

现在,只要我按下注释上的按钮,它只会删除图钉。

如何让它对右键和左键做出不同的响应?

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    id <MKAnnotation> annotation = [view annotation];
    if ([annotation isKindOfClass:[MKPointAnnotation class]])
    {
        NSLog(@"Clicked");
        if(view.rightCalloutAccessoryView){
             [self.mapView removeAnnotation:annotation];
        }
        else{
            float lat= annotation.coordinate.latitude;
            float longitude = annotation.coordinate.longitude;
            [self.mapView removeAnnotation:annotation];
            MKPointAnnotation *pointAnnotation = [[MKPointAnnotation alloc] init];
            pointAnnotation.title = _titleOut.text;
            pointAnnotation.subtitle = _subtitle.text;
            pointAnnotation.coordinate = CLLocationCoordinate2DMake(lat, longitude);
            [self.mapView addAnnotation:pointAnnotation];
        }
    }
}

最佳答案

这一行:

if(view.rightCalloutAccessoryView){

本质上说“如果 view.rightCalloutAccessoryView 不为零”。

由于您要在所有 注释 View 上设置右侧附件,因此 if条件将始终为真,因此点击任一个附件将执行 if 中的代码也就是去掉注解。

相反,您想检查在调用委托(delegate)方法的这种特定情况下点击了哪个按钮或控件(而不是 View 是否定义了右侧附件)。

幸运的是,委托(delegate)方法准确传递了在 control 中点击的控件。范围。

control参数可以直接与 View 的右/左附件 View 进行比较,以判断哪个被点击:

if (control == view.rightCalloutAccessoryView) {



一些不相​​关的点:

  1. latitudelongitude注释中的属性属于 CLLocationDegrees 类型(又名 double )比 float 具有更高的精度所以为了避免失去准确性,请使用 CLLocationDegreesdouble :

    CLLocationDegrees lat= annotation.coordinate.latitude;
    
  2. MKPointAnnotation允许您更改 title直接(它不像默认的 id<MKAnnotation> 那样是只读的)所以您不需要删除和创建新的注释。它稍微简化了代码:

    -(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    
        if ([view.annotation isKindOfClass:[MKPointAnnotation class]])
        {
            NSLog(@"Clicked");
    
            if (control == view.rightCalloutAccessoryView) {
                [self.mapView removeAnnotation:view.annotation];
            }
            else {
                // Cast view.annotation as an MKPointAnnotation
                // (which we know it is) so that compiler sees
                // title is read-write instead of the
                // default id<MKAnnotation> which is read-only.
                MKPointAnnotation *pa = (MKPointAnnotation *)view.annotation;
    
                pa.title = _titleOut.text;
                pa.subtitle = _subtitle.text;
    
                //If you want callout to be closed automatically after
                //title is changed, uncomment the line below:
                //[mapView deselectAnnotation:pa animated:YES];
            }
        }
    }
    

关于ios - 如何判断在 calloutAcessoryControlTapped 中按下了哪个按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29524170/

相关文章:

ios - 在 Swift 中的 sendSynchronousRequest 方法中传递子类变量

ios - KMLViewer 问题

iphone - 当前位置的自定义标注

ios - 具有关联值的开关内部的 Swift Mutation

iphone - glDrawArrays 在每一帧上分配内存

objective-c - 如何在 Swift 中绘制地址,将地址转换为经纬度坐标?

ios - 如何删除所有注释图钉然后添加一个新图钉

ios - 单击注释时如何访问可用数据?

ios - 如何从 MKAnnotationView 标注中排除用户位置?

ios - 下一个轨道AVPlayer如何