1

我正在编写一个 iPad 应用程序(os 3.2),它使用 MKMapKit 在地图上显示移动注释。通过 XML 从三个不同的来源检索信息,并在我的 Annotation 类中进行整理,然后显示在地图上。此信息每 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;

运行这个新代码导致注释被添加到原始位置,但它们根本没有移动。当我获取 XML 提要时,我正在更新 source1、source2、source3 内的坐标。

所以经过一整天的调试和尝试各种事情后,我让它工作了。然后我开始删除我在一天中添加的所有内容,以获得以下最小的更改以使其工作,结果非常奇怪:

界面未修改。在实现中,我添加了一个方法并添加了另外三行:

@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 语句,所以我知道它被调用了。这完全没有任何意义。

任何见解将不胜感激。

干杯,

布雷特

4

2 回答 2

2

我的猜测是这与没有实现坐标属性有关。来自 MKAnnotation 协议文档。

采用此协议的对象必须实现坐标属性。

也许因为您没有坐标属性,所以您需要 setCoordinate 方法才能正确处理注释。

您是否尝试过添加

@synthesize coordinate;

到您的 .m 文件?假设您的标题中仍然有属性声明?

您可能必须在属性声明中为您的方法专门设置 getter。就像是

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

然后将您的坐标方法重命名为 getCoordinate。

注意:可以避免使用 getter 属性并更改坐标访问器名称,但我还没有测试过。

于 2010-11-05T18:23:46.043 回答
0

设置坐标:

设置注释的新中心点。- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate 参数

新坐标

The new center point for the annotation.

讨论

支持拖动的注解应该实现这个方法来更新注解的位置。可用性

**Available in iOS 4.0 and later.**

在 MKAnnotation.h 中声明

于 2011-07-22T17:33:34.097 回答