3

マップビューにmkannotationがあり、mkannotationviewと、クリックすると子uiviewcontrollerに移動するcalloutviewがあります。コールアウトのuiviewcontrollerからいくつかのプロパティを更新していますが、終了したら、マップ上の注釈の位置を移動して、注釈のタイトルとサブタイトルを変更したいと思います。コールアウトのuiviewcontollerからこれを簡単に行うにはどうすればよいですか?これを処理するための最もエレガントな方法は何ですか?誰かが持っているなら、コードサンプルは素晴らしいでしょう。

ありがとう

4

4 に答える 4

1

@Calebが提案するようにアノテーションを削除して追加し直すこともできますが、別のオプションは、coordinate移動するアノテーションのプロパティを直接更新することです。

これは、アノテーションクラスが実装されている場合にのみ機能することに注意してください。これは、 (組み込みクラスのように)の代わりにassetCoordinateを宣言することで簡単に実行できます。マップビューはKVOを介して変更を確認し、注釈を移動します。coordinateassignMKPointAnnotationreadonly

子ビューコントローラーに、変更する注釈と新しい座標をマップビューコントローラーに指示させるには、別の回答が示すように、delegate+protocolを使用することをお勧めします。

于 2012-01-28T15:38:46.120 に答える
1

注釈をマップから完全に削除し、更新して、再度マップに追加します。これにより、注釈の場所が変更されたことをマップが認識できるようになります。

于 2012-01-28T14:33:21.100 に答える
1

あなたがやりたいことを処理するために、MapCallBackDelegateなどのプロトコルを作成します。これにより、コードの密結合が回避されます。これをマップ注釈ビューのヘッダー ファイルに入れます

@protocol MapCallBackDelegate
    -(void)updateAnnotation:(id)whatEverParamsYouWant;
@end

次に、マップ ビューにこのプロトコルを実装させます。マップ アノテーション ビューを作成するときに、プロパティを指定します。

@property (nonatomic, retain) id<MapCallBackDelegate> callbackDelegate;

マップに追加するときは、そのプロパティを self に設定します

myMapAnnotationView.callbackDelegate = self;

したがって、タイトル/サブタイトル/位置を変更したい場合は、callbkacDelegate でそのメッセージを呼び出すだけです。

これは、密結合コードを削減し、後でコードを再利用するために他のオブジェクトが同じプロトコルを実装できるようにし、MapAnnotationView に情報を隠すことを促進するため、洗練されています。

于 2010-12-02T00:47:29.590 に答える
0

最も簡単な方法は、子View Controllerから実際に実行しないことです。あなたのニーズは質問から私が理解しているものとは異なるかもしれませんが、最初は赤面して次のようにします:

ヘッダー内:

@interface YourController
{
    ...
    MKAnnotation *_latestDetailViewed;
}

... 
@property(nonatomic, retain) MKAnnotation *latestDetailViewed;

@end

次に、.mで次のようなもの

@implementation YourController

... 
@synthesize latestDetailViewed = _latestDetailViewed;

...
-(void) dealloc
{
    ...
    self.latestDetailViewed = nil;
    [super dealloc];
}

-(void) whereverYouLaunchYourDetailScreenFrom:(MKAnnotation*)detailAnnotation
{
    self.latestDetailViewed = detailAnnotation;
    // then create/push your view controller
}

-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if(_latestDetailViewed)
    {
        // Do whatever you want to the annotation here
        self.latestDetailViewed = nil;
    }
}

そうすれば、マップに戻ったときに変更が反映されます。一度に 1 つの注釈の詳細ビューのみを実際に起動し、その間に常にマップに戻る場合は、デリゲート プロトコルの記述や NSNotification の起動を行わなくても機能するはずです。

私があなたの状況を誤解している場合はお知らせください。別の回答をいたします:)

于 2010-12-05T08:43:33.323 に答える