2009-09-03 15 views
3

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

おかげ

答えて

1

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

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

次に、マップビューにこのプロトコルを実装します。あなたは、マップ注釈ビューを作成すると、それをプロパティ

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

を与えると、あなたのマップに追加するとき、あなたはタイトル/サブタイトルを変更したいとき

myMapAnnotationView.callbackDelegate = self; 

ので、自己にそのプロパティを設定します/ position、callbkacDelegateでそのメッセージを呼び出すだけです。

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

+0

@Zap:私はあなたを正確に取得しませんでした。 –

0

最も簡単な方法は、実際には子ビューコントローラーからは行いません。たぶん、あなたのニーズは、私は質問から理解するものとは異なりますが、一見私はこのようなものだろう:

@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; 
    } 
} 
よう.M何かに続いて

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

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

@end 

:ヘッダで

地図に戻ったときに変更が加えられます。一度に1つの注釈の詳細ビューを起動し、常にその間の地図に戻るのであれば、デリゲートプロトコルを書くことやNSNotificationsを起動することなく対処する必要があります。

私はあなたの状況は私が知っていると私はあなたに別の答えを与えるでしょう:)

+0

Mr.MahatmaManicは、Gusの駅のような最寄りの場所を見つけるのを手伝ってくれるでしょうか?2.5klmか別のklm iphone mapアプリケーションの間で私の現在の場所に他のホットな場所を見つけることができます。 @ gmail.com)m – Rocky

+0

もちろんです。まず、Mapアプリケーションを起動します。次に、画面上部に検索バーがあります。その検索バーに「ガソリンスタンド」と入力します。 – MahatmaManic

1

、完全マップから注釈を削除し、それを更新し、再びマップに追加誤解していた場合。これにより、注釈の場所が変更されたことが地図に確実に伝わるようになります。

1

@Calebが示唆するようにアノテーションを削除して追加することもできますが、別の方法として、移動するアノテーションのcoordinateプロパティを直接更新することもできます。あなたのアノテーションクラスが簡単にcoordinateassignなどの代わりに、readonly(ビルトインMKPointAnnotationクラスないように)宣言することによって行うことができsetCoordinateを実装している場合にのみ動作することを

注意。マップビューはKVOを介して変更を確認し、注釈を移動します。

マップビューコントローラに変更する注釈と新しい座標を教えるようにするには、もう一つの答えとして、delegate +プロトコルを使用することをお勧めします。

関連する問題