Swift 中的自定义 MKAnnotation 未添加到地图的注释中

Posted

技术标签:

【中文标题】Swift 中的自定义 MKAnnotation 未添加到地图的注释中【英文标题】:Custom MKAnnotation in Swift not being added to map's annotations 【发布时间】:2014-10-30 17:20:19 【问题描述】:

我在 Swift 中创建了一个最小的自定义 MKAnnotation:

import UIKit
import MapKit
class MyAnnotation : NSObject, MKAnnotation 
    var coordinate: CLLocationCoordinate2D
    var title: String = ""
    var subtitle: String = ""
    init(location coord:CLLocationCoordinate2D) 
        self.coordinate = coord
        super.init()
    

然后我以正常方式将它添加到我的 MKMapView 中:

let ann = MyAnnotation(location:self.annloc)
self.map.addAnnotation(ann)

注释出现在地图上。 (我也有一个自定义的 MKAnnotationView,但这无关紧要。)但是有一个问题;注释实际上并不存在。我的意思是,当我请求地图的注释数组 self.map.annotations 时,它是空的。

这似乎纯粹是一个 Swift 问题。如果我将 MyAnnotation 替换为 Objective-C 实现,并更改我的项目的其他内容,它会完美运行!此 MyAnnotation 确实按预期显示在 self.map.annotations 中:

// === .h file:
#import <Foundation/Foundation.h>
@import MapKit;
@interface MyAnnotation : NSObject <MKAnnotation> 
@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title, *subtitle;
- (id)initWithLocation:(CLLocationCoordinate2D)coord;
@end
// === .m file:
#import "MyAnnotation.h"
@implementation MyAnnotation
- (id)initWithLocation: (CLLocationCoordinate2D) coord 
    self = [super init];
    if (self) 
        self->_coordinate = coord;
    
    return self;

@end

这个问题是一个晦涩难懂的问题,您可能正在使用用 Swift 编写的自定义 MKAnnotation,而没有意识到有任何问题。但问题是真实存在的,可能会在未来造成麻烦。

所以我们非常清楚地知道,用 Swift 编写的 MKAnnotation 不起作用,而用 Objective-C 编写的 MKAnnotation 则完全一样。问题是:为什么?其次:我们能做些什么吗?是否可以在纯 Swift 中编写一个 MKAnnotation 以正确显示在地图的 annotations 数组中?

我猜这个问题要么与 KVC 有关,要么与这样一个事实有关,让我们面对现实吧,Swift 对象与 Objective-C 对象并不完全相同。我已经尝试在我的 Swift 版本的 MKAnnotation 中添加各种类似 KVC 的功能,dynamic 等,但似乎没有任何帮助。

【问题讨论】:

有趣的是,注释 确实 出现在 map.annotationsInMapRect(map.visibleMapRect) 中(当然,只要它在 visibleMapRect 内),它返回一个 NSSet。我认为这是有道理的,因为MKMapView 可能会使用它来确定要显示哪些注释,并且这些注释确实会显示在地图上。 【参考方案1】:

在我写这个问题的时候,这一定是 Swift 中的一个错误,因为现在(Xcode 6.3)这个问题已经消失了——问题已经解决了。

【讨论】:

以上是关于Swift 中的自定义 MKAnnotation 未添加到地图的注释中的主要内容,如果未能解决你的问题,请参考以下文章

单击时执行特定操作的自定义 MKAnnotation 引脚 - 自定义引脚未显示

如何为 MkAnnotation View 自定义视图,就像表格视图的自定义单元格一样?

如何在 Swift 中扩展 NSManagedObject 以包含 MKAnnotation?

swift Swift中的自定义地图

Swift 中的自定义 Segue

swift Swift 4中的自定义JSON编码/解码