1

マップビューの注釈オブジェクトに追加するボタンがあるとします。

 AnnotationButton* rightButton = [AnnotationButton buttonWithType:UIButtonTypeDetailDisclosure];
            [rightButton addTarget:self
                            action:@selector(showDetails:)
                  forControlEvents:UIControlEventTouchUpInside];

ボタンをクリックすると、ボタンが関数を呼び出すshowDetailsことがわかります。

Show details は として定義され- (void)showDetails:(id)sender;、送信者を取ります。より多くの変数を送信する方法、または別の送信者を関連付ける方法はありますか? その理由は、ボタンをクリックして、そのボタンに関連付けられている注釈を教えてほしいからです。注釈は、ボタンが作成されたコンテキストで使用できる他のオブジェクトであると考えてください。

UIButton クラスをサブクラス化し、その中に追加情報を格納することを考えましたが、それはハックのようです。

何か案は?

4

2 に答える 2

3

このボタンがMKAnnotationViewのrightCalloutAccessoryViewまたはに使用されている場合、マップのデリゲートは、ボタンがタップされたときにメッセージを受信する必要があります。これにより、タップされた MKAnnotationView インスタンスが渡されます。これには、対応する注釈を提供するプロパティがあります。ボタンでアクションを直接使用しようとする代わりに、それを利用する必要があります。leftCalloutAccessoryViewmapView:annotationView:calloutAccessoryControlTapped:annotation

于 2011-03-12T03:34:44.593 に答える
2

いいえ、アクション メッセージに送信される内容を変更する方法はありません。2 つの引数を要求できますが、それらはボタンとそれをトリガーしたイベントになります。欲しいものを手に入れるには、2 つの選択肢があります (今考えられることです)。

  1. ボタンのtagプロパティを使用します。配列内の注釈のインデックスなど、注釈を識別する一意のタグを各ボタンに付けることができます。showDetails:次に、メソッドで注釈を取得するのは簡単です。
  2. UIButton をサブクラス化します。組み込みオブジェクトに機能を追加することに問題はありません。追加する必要があるのは、オブジェクトを保持するためのプロパティだけです。おまけ:idプロパティにジェネリック型を使用し、 などのジェネリック名を付けれrepresentedObjectば、将来、他のプロジェクトでも使用できます。
  3. Anomie からobjc_setAssociatedObject を使用して、サブクラス化せずにボタンに値を追加します。使いやすくするために、UIButton にカテゴリを追加することをお勧めします。
于 2011-03-11T18:53:10.493 に答える