OGeek|极客世界-中国程序员成长平台

标题: ios - 如何判断在 calloutAcessoryControlTapped 中按下了哪个按钮? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 06:21
标题: ios - 如何判断在 calloutAcessoryControlTapped 中按下了哪个按钮?

我正在使用 MapKit,并且我的别针中有 2 个标注配件。

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

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

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

-(void)mapViewMKMapView *)mapView annotationViewMKAnnotationView *)view calloutAccessoryControlTappedUIControl *)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];
        }
    }
}



Best Answer-推荐答案


这一行:

if(view.rightCalloutAccessoryView){

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

由于您在 all 注释 View 上设置右侧附件,因此 if 条件将始终 为真,因此点击 either 附件将执行该 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 那样只读)所以你不需要删除和创建一个新的注释。它稍微简化了代码:

    -(void)mapViewMKMapView *)mapView annotationViewMKAnnotationView *)view calloutAccessoryControlTappedUIControl *)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/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4