1

詳細開示ボタンを使用して MKAnnotationView を作成しています。

mapView: viewForAnnotation: プレースホルダー ボタンを作成するだけです。

//  the right accessory view needs to be a disclosure button ready to bring up the photo
aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

mapView で: didSelectAnnotationView: 実際に使用するボタンを作成します (関連するタグを使用)

//  create a button for the callout
UIButton *disclosure                = [self.delegate mapController:self buttonForAnnotation:aView.annotation];

NSLog(@"DisclosureButton: %@", disclosure);

//  set the button's target for when it is tapped upon
[disclosure addTarget:self.delegate action:@selector(presentAnnotationPhoto:) forControlEvents:UIControlEventTouchUpInside];

//  make the button the right callout accessory view
aView.rightCalloutAccessoryView = disclosure;

ログでは、ボタンは完全にインスタンス化され、正しいタグが設定されているように見えます。

これはボタン作成者です:

/**
 *  returns an button for a specific annotation
 *
 *  @param  sender              the map controller which is sending this method to us (its' delegate)
 *  @param  annotation          the annotation we need to create a button for
 */
- (UIButton *)mapController:(MapController *)   sender
        buttonForAnnotation:(id <MKAnnotation>) annotation
{
    //  get the annotation as a flickr photo annotation
    FlickrPhotoAnnotation *fpa  = (FlickrPhotoAnnotation *)annotation;

    //  create a disclosure button used for showing photo in callout
    UIButton *disclosureButton      = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    //  associate the correct photo with the button
    disclosureButton.tag            = [self.photoList indexOfObject:fpa.photo];

    return disclosureButton;
}

注釈を選択すると問題が発生します。アノテーションを選択して詳細開示ボタンをタップしても数秒間何も起こりません。ただし、注釈を数回タップして元に戻し、ボタンをテストした後、最終的には期待どおりに機能します。

奇妙な遅延で何が起こっているのですか?ボタンが機能しようとしているときに、タップして表示されるまで、アルファが 0.0 に設定されているように見えることがあります。

真剣に、私が遭遇した奇妙な問題の 1 つです。

4

1 に答える 1

2

デリゲート メソッドが呼び出される前didSelectAnnotationViewに、マップ ビューは注釈ビューのプロパティに基づいて吹き出しビューを準備しています (変更前)。

したがって、最初のタップで表示されるコールアウトには、アプリが で行った変更はありませんdidSelectAnnotationView。次のタップでは、コールアウトは前のタップで設定された値に基づいている可能性があります (これは実際には、注釈ビューの再利用が でどのように処理されるかに依存しますviewForAnnotation)。

コードが実行しているのは、ボタンのアクションとタグを設定しているだけのようdidSelectAnnotationViewですbuttonForAnnotation

presentAnnotationPhoto:メソッドは選択した注釈のプロパティを参照する必要があるため、「タグ」アプローチを使用していると思います。

アクション メソッドで選択した注釈を取得するためにタグを使用する必要はありません。代わりに、より良いオプションがいくつかあります。

  • カスタム アクション メソッドは、マップ ビューのselectedAnnotationsプロパティから選択された注釈を取得できます。これを行う方法の例については、この質問を参照してください。
  • calloutAccessoryControlTappedカスタム アクション メソッドの代わりに、マップ ビュー独自のデリゲート メソッドを使用します。デリゲート メソッドは、その注釈 (つまり ) を指すプロパティを含む注釈ビューへの参照を渡すview.annotationため、どの注釈が選択されたかについての推測、検索、または質問はありません。このオプションをお勧めします。

最初のオプションでは、addTargetinviewForAnnotationを実行し、わざわざ設定しないでくださいtagbuttonForAnnotationメソッドも必要ありません。次に、ボタン アクション メソッドで、選択した注釈を から取得しmapView.selectedAnnotationsます。

現在、アクション メソッドはオンにself.delegateなっているため、他のコントローラーからマップ ビューにアクセスする際に問題が発生する可能性があります。あなたができることは、選択された注釈を取得してからアクションメソッドを呼び出すマップコントローラーでローカルボタンアクションメソッドを作成することです (ただし、ボタンタップハンドラーではなく、注釈パラメーターを受け入れるようにメソッドを記述できるようになりました)。presentAnnotationPhoto:self.delegate

2 番目のオプションは似ていますが、何もする必要がなくaddTarget、メソッド内でoncalloutAccessoryControlTappedを呼び出します。 presentAnnotationPhoto:self.delegate

両方のオプションについて、メソッドを変更して、現在の代わりにpresentAnnotationPhoto:注釈オブジェクト自体を受け入れるようにすることをお勧めします(注釈を渡します。FlickrPhotoAnnotation *UIButton *presentAnnotationPhoto:

于 2012-10-11T12:24:43.593 に答える