2009-09-03 4 views
3

У меня есть mkannotation, расположенная на карте, которая имеет mkannotationview, а также calloutview, которая при нажатии идет на дочерний uiviewcontroller. Я обновляю некоторые свойства из uiviewcontroller callout, но после того, как я закончен, я хочу переместить позицию аннотации на карту и изменить название аннотации и субтитры. Как я могу сделать это с помощью uiviewcontoller callout? Какой самый элегантный способ справиться с этим? Образец кода был бы отличным, если бы у кого-то было.Обновление свойств 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

Самый простой способ - фактически не делать это с контроллера детского вида. Может быть, ваши потребности отличаются от того, что я понял из вопроса, но на первый взгляд, я бы что-то вроде этого:

В заголовке:

@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

Можете ли вы помочь мне Mr.MahatmaManic найти ближайшее место, такое как станция Gus, и другое горячее место в моем текущем местоположении между 2.5klm или на другом приложении klm iphone map. Итак, если у вас есть решение, пожалуйста, отправьте его и помогите мне, пожалуйста, мой id (harishdy @ gmail.com) m – Rocky

+0

Несомненно. Сначала запустите приложение «Карта». Затем в верхней части экрана находится панель поиска. В этой строке поиска вы должны ввести «АЗС». – MahatmaManic

1

Удалить аннотацию с карты целиком, обновить его, и добавить его на карту еще раз. Это гарантирует, что карта заметит, что местоположение аннотаций изменилось.

1

Хотя вы можете удалить и добавить аннотацию обратно, как предлагает @Caleb, другой вариант - обновить свойство coordinate непосредственно на аннотации, которую вы хотите переместить.

Обратите внимание, что это будет работать только если ваш класс аннотаций реализует setCoordinate, которые можно легко сделать путем объявления coordinate в assign (как встроенный MKPointAnnotation класса делает) вместо readonly. На экране карты будет отображаться изменение через KVO и перемещение аннотации.

Чтобы диспетчер просмотра дочерних элементов сообщил контроллеру вида карты, какую аннотацию изменить и какие новые координаты, я рекомендую использовать делегат + протокол, как предлагает другой ответ.

Смежные вопросы