2009-09-03 32 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作为另一个答案。