我有一个位于mapview上的mkannotation,它有一个mkannotationview以及一个calloutview,当点击它时会转到子uiviewcontroller。我正在从callout的uiviewcontroller更新一些属性,但是在我完成后我想在地图上移动注释的位置并更改注释标题和副标题。如何从callout的uiviewcontoller轻松完成此操作?处理这个问题最优雅的方法是什么?如果有人有代码示例,那么代码示例会很棒。
谢谢
答案 0 :(得分:1)
我会创建一个协议,比如MapCallBackDelegate来处理你想要做的事情。这避免了紧密耦合的代码。将它放在地图注释视图头文件
中@protocol MapCallBackDelegate
-(void)updateAnnotation:(id)whatEverParamsYouWant;
@end
然后让Map View实现此协议。创建地图注释视图时,请为其指定属性
@property (nonatomic, retain) id<MapCallBackDelegate> callbackDelegate;
当您将其添加到地图时,请将该属性设置为self
myMapAnnotationView.callbackDelegate = self;
因此,当您想要更改标题/副标题/位置时,您只需在callbkacDelegate上调用该消息。
这很优雅,因为它减少了紧密耦合的代码,允许其他对象为以后的代码重用实现相同的协议,并促进MapAnnotationView中的信息隐藏。
答案 1 :(得分:1)
完全从地图中删除注释,更新它,然后再次将其添加到地图中。这将确保地图注意到注释位置已更改。
答案 2 :(得分:1)
虽然您可以在@Caleb建议的情况下删除并添加注释,但另一个选项是直接在您要移动的注释上更新coordinate
属性。
请注意,这仅在您的注释类实现setCoordinate
时才有效,这可以通过将coordinate
声明为assign
(就像内置的MKPointAnnotation
类一样轻松完成而不是readonly
。地图视图将通过KVO查看更改并移动注释。
要让子视图控制器告诉地图视图控制器要更改哪个注释以及新坐标是什么,我建议使用委托+协议作为另一个答案建议。
答案 3 :(得分: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。
如果我误解了你的情况,请告诉我,我会给你一个不同的答案:)