2009-09-03 85 views
3

我有一個mkannotation位於有一個mkannotationview以及一個calloutview,當點擊進入一個孩子uiviewcontroller的mapview。我正在更新標註的uiviewcontroller中的一些屬性,但完成後我想要在地圖上移動標註的位置並更改標註標題和副標題。我怎樣才能輕鬆地從標註的uiviewcontoller中做到這一點?什麼是最優雅的方式來處理這個問題?如果任何人有任何代碼示例會很好。刷新mkannotation屬性和刷新註釋

感謝

回答

1

我想創建一個協議,說MapCallBackDelegate,來處理你想要做什麼。這避免了緊密耦合的代碼。把它放在你的地圖註解視圖頭文件中

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

然後讓你的Map View實現這個協議。當您創建地圖標註來看,給它一個屬性

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

而當你將它添加到您的地圖,該屬性設置爲自

myMapAnnotationView.callbackDelegate = self; 

所以,當你想改變標題/副標題/位置,您只需在callbkacDelegate上調用該消息即可。

這是因爲它減少了緊密耦合的代碼,允許其他對象實現相同的協議以便稍後重用代碼,並促進信息隱藏在您的MapAnnotationView中。

+0

@Zap:我沒有完全明白你的意思。 –

0

最簡單的方法實際上不會從子視圖控制器執行它。也許你需要的是從我的問題理解不同,但乍一看,我會做這樣的事情:

在標題:

@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; 
    } 
} 

這樣,當你回到地圖上時,你的改變就會發生。如果你實際上一次只爲一個註釋啓動一個細節視圖,並且總是返回到它們之間的地圖,那麼它應該可以工作,而不需要處理編寫委託協議或觸發NSNotifications。

如果我誤解你的情況讓我知道,我給你一個不同的答案:)

+0

你能幫我先生MahatmaManic找到像Gus站和其他熱點位置最近的位置到我目前的位置之間2.5klm或不同的klm iphone地圖應用程序所以,如果有任何解決方案,請發送和幫助我請我的身份證(harishdy @ gmail.com)m – Rocky

+0

當然。首先,啓動Map應用程序。然後,在屏幕的頂部,有一個搜索欄。在該搜索欄中,您應該鍵入「加油站」。 – MahatmaManic

1

從地圖刪除標註完全,更新,並再次將其添加到地圖中。這將確保地圖注意到註釋位置已更改。

1

雖然您可以按照@Caleb建議的方式刪除並添加註釋,但另一個選項是直接在您要移動的註釋上更新coordinate屬性。

請注意,如果您的註釋類實現setCoordinate它可以很容易地通過聲明coordinateassign(如內置MKPointAnnotation類一樣),而不是readonly做這隻會工作。地圖視圖將通過KVO看到更改並移動註釋。

要讓子視圖控制器告訴地圖視圖控制器要更改哪個註釋和新座標是什麼,我推薦使用delegate + protocol作爲另一個答案。