Почему я должен реализовать setCoordinate, чтобы мои аннотации переместились в MKMapKit? - PullRequest
1 голос
/ 19 октября 2010

Я пишу приложение для iPad (OS 3.2), которое использует MKMapKit для отображения движущихся аннотаций на карте. Информация извлекается через XML из трех разных источников и собирается вместе в моем классе аннотаций, а затем отображается на карте. Эта информация поступает каждые 5 секунд. У меня это работало нормально в течение нескольких месяцев, и мои аннотации двигались по мере необходимости.

Весь следующий код является близким приближением к коду (не может опубликовать точный код моей компании), и он был напечатан построчно, поэтому он не будет компилироваться.

Мой код аннотации выглядел примерно так:

@interface MyFunkyAnnotation : NSObject <MKAnnotation>
{
  CLLocationCoordinated2D coordinate;
  NSString *identifier;
  // Lots of other fields that can be displayed.
}
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, retain) NSString *identifier;

// Lots of other properties as above.
-(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky;

@end

Тогда в моей реализации у меня были такие вещи:

@implementation MyFunkyAnnotation

@synthesize coordinate;

-(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky
{
  [self setCoordinate:[newFunky coordinate]];
  [self setIdentifier:[newFunky identifier]];
  // Lots more updating of various properties.
}
@end

Это отлично сработало, поэтому я, конечно, решил переделать все это и инкапсулировать много информации в другие классы.

Так что теперь мой код выглядит следующим образом:

@interface MyFunkyAnnotation: NSObject <MKAnnotation>
{
   SourceInfo_1  *source1;  // Contains its own coordinate property;
   SourceInfo_2  *source2;  // Contains its own coordinate property;
   SourceInfo_3  *source3;  // Contains its own coordinate property;
}
@property (nonatomic, retain) SourceInfo_1 *source1;
@property (nonatomic, retain) SourceInfo_2 *source2;
@property (nonatomic, retain) SourceInfo_3 *source3;

-(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky;
-(CLLocationCoordinate2D)coordinate;

@end

Новая реализация:

@implementation MyFunkyAnnotation

@synthesize source1, source2, source3;

-(CLLocationCoordinate2D)coordinate
{
   if ([source1 dataReliable] == YES)
   {
      return [source1 coordinate];
   }
   else if ([source2 dataReliable] == YES)
   {
      return [source2 coordinate];
   }
   else
   {
      return [source3 coordinate];
   }
 }

 -(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky;
 {
    if ([newFunky source1] != nil)
    {
      [self setSource1:[newFunky source1];
    }
    if ([newFunky source2] != nil)
    {
      [self setSource2:[newFunky source2];
    }
    if ([newFunky source3] != nil)
    {
      [self setSource3:[newFunky source3];
    }
 }
 @end;

Запуск этого нового кода привел к добавлению аннотаций в исходное местоположение, но они вообще никогда не перемещались. Я обновляю координаты внутри источника1, источника2, источника3, когда получаю каналы XML.

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

Интерфейс не изменен. В реализации я добавил один метод и добавил три другие строки:

@implementation MyFunkyAnnotation

@synthesize source1, source2, source3;

-(void)setCoordinate:(CLLocationCoordinate2D)coordinate   //  <-- New method
{
  nil;
}

-(CLLocationCoordinate2D)coordinate
{
   if ([source1 dataReliable] == YES)
   {
      return [source1 coordinate];
   }
   else if ([source2 dataReliable] == YES)
   {
      return [source2 coordinate];
   }
   else
   {
      return [source3 coordinate];
   }
 }

 -(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky;
 {
    if ([newFunky source1] != nil)
    {
      [self setSource1:[newFunky source1];
      [self setCoordinate:[[newFunky source1] coordinate]];  //  <--- New Line
    }
    if ([newFunky source2] != nil)
    {
      [self setSource2:[newFunky source2];
      [self setCoordinate:[[newFunky source2] coordinate]];  //  <--- New Line
    }
    if ([newFunky source3] != nil)
    {
      [self setSource3:[newFunky source3];
      [self setCoordinate:[[newFunky source3] coordinate]];  //  <--- New Line
   }
 }
 @end;

Может кто-нибудь объяснить, почему нужно вызывать метод, который на самом деле ничего не делает. «Nil» было заявлением NSLog, так что я знаю, что оно вызывалось. Это абсолютно бессмысленно.

Любое понимание будет с благодарностью.

Приветствия

Brett

Ответы [ 2 ]

2 голосов
/ 05 ноября 2010

Я предполагаю, что это как-то связано с отсутствием свойства координат.Из документации протокола MKAnnotation.

Объект, который принимает этот протокол, должен реализовывать свойство координат.

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

Вы пытались добавить

@synthesize coordinate;

к вашему .m файлу?Предполагая, что у вас все еще есть объявление свойства в вашем заголовке?

Возможно, вам придется специально установить метод получения для вашего метода в объявлении свойства.Что-то вроде

@property (nonatomic, assign, getter=getCoordinate) CLLocationCoordinate2D coordinate;

и затем переименуйте ваш метод координат в getCoordinate.

ПРИМЕЧАНИЕ: возможно, можно избежать использования атрибута getter и изменить имя метода доступа к координатам, но я не проверялэто вне.

0 голосов
/ 22 июля 2011

setCoordinate:

Устанавливает новую центральную точку аннотации.- (void) setCoordinate: (CLLocationCoordinate2D) newCoordinate Параметры

newCoordinate

The new center point for the annotation.

Обсуждение

Аннотации, поддерживающие перетаскивание, должны реализовывать этот метод для обновления позиции аннотации.Наличие

**Available in iOS 4.0 and later.**

Объявлено в MKAnnotation.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...