菜鸟教程小白 发表于 2022-12-13 06:21:48

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


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

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

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

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

<pre><code>-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    id &lt;MKAnnotation&gt; annotation = ;
    if (])
    {
      NSLog(@&#34;Clicked&#34;);
      if(view.rightCalloutAccessoryView){
             ;
      }
      else{
            float lat= annotation.coordinate.latitude;
            float longitude = annotation.coordinate.longitude;
            ;
            MKPointAnnotation *pointAnnotation = [ init];
            pointAnnotation.title = _titleOut.text;
            pointAnnotation.subtitle = _subtitle.text;
            pointAnnotation.coordinate = CLLocationCoordinate2DMake(lat, longitude);
            ;
      }
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这一行:</p>

<pre><code>if(view.rightCalloutAccessoryView){
</code></pre>

<p>本质上说“如果 view.rightCalloutAccessoryView 不为零”。</p>

<p>由于您在 <em><strong>all</strong></em> 注释 View 上设置右侧附件,因此 <code>if</code> 条件将<em><strong>始终</strong></em> 为真,因此点击 <em>either</em> 附件将执行该 <code>if</code> 内的代码,用于删除注释。</p>

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

<p>幸运的是,委托(delegate)方法准确地传递了 <code>control</code> 参数中所点击的控件。 </p>

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

<pre><code>if (control == view.rightCalloutAccessoryView) {
</code></pre>

<p></p><hr/>
<br/>
一些不相​​关的点:<p></p>

<ol>
<li><p>注解中的 <code>latitude</code> 和 <code>longitude</code> 属性属于 <code>CLLocationDegrees</code>(又名 <code>double</code>)类型,比 <code>float</code> 具有更高的精度,因此为避免丢失精度,请使用 <code>CLLocationDegrees</code> 或 <code>double</code>:</p>

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

<pre><code>-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {

    if (])
    {
      NSLog(@&#34;Clicked&#34;);

      if (control == view.rightCalloutAccessoryView) {
            ;
      }
      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&lt;MKAnnotation&gt; 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:
            //;
      }
    }
}
</code></pre> </li>
</ol></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何判断在 calloutAcessoryControlTapped 中按下了哪个按钮?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/29524170/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/29524170/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何判断在 calloutAcessoryControlTapped 中按下了哪个按钮?