【问题标题】:custom MKAnnotation not moving when coordinate set坐标集时自定义MKAnnotation不移动
【发布时间】:2015-12-26 21:19:36
【问题描述】:

我已经设置了自定义 MKAnnotation

class Location: NSObject, MKAnnotation {
    var id: Int
    var title: String?
    var name: String

    var coordinate: CLLocationCoordinate2D {
        didSet{
            didChangeValueForKey("coordinate")
        }
    }

当我设置坐标时,它不会移动地图上的图钉。我添加了带有关键字坐标的“didSet”,因为我发现人们说这会迫使它更新。但什么也没有,它不动。我已经验证了纬度/经度已经改变并且是正确的,大头针只是没有移动。标题更新并显示更改。

我必须假设它,因为这是一个自定义注释。有什么帮助吗?

【问题讨论】:

    标签: swift mkmapview mkannotation


    【解决方案1】:

    如果您要手动发布这些更改事件,您也必须在willSet 中调用willChangeValue(forKey:)。在 Swift 4 中:

    var coordinate: CLLocationCoordinate2D {
        willSet {
            willChangeValue(for: \.coordinate)
        }
        didSet {
            didChangeValue(for: \.coordinate)
        }
    }
    

    或者在 Swift 3 中:

    var coordinate: CLLocationCoordinate2D {
        willSet {
            willChangeValue(forKey: #keyPath(coordinate))  
        }
        didSet {
            didChangeValue(forKey: #keyPath(coordinate))
        }
    }
    

    或者,更简单,只需将其指定为 dynamic 属性,此通知内容就会为您完成。

    @objc dynamic var coordinate: CLLocationCoordinate2D
    

    对于 Swift 2 版本,请参阅previous rendition of this answer

    【讨论】:

    • willChangeValuedidChangeValue 的需要是 KVO 的基础,这是这里使用的机制。两者的文档都明确指出每个必须与另一个结合使用。回复 dynamic 和 KVO,请参阅 Using Key-Value Observing in Swift: Annotate a Property for Key-Value Observing
    • 我知道 KVO 系统,但是您是否应该“知道”在这种情况下使用它并且您需要这样做? Apple 是否在 MapKit 的某个地方记录了这一点?
    • 我知道旧的Location and Maps Programming Guide 中埋有一张便条,上面写着:
    • "重要提示:如果您选择自己实现此属性的方法,或者在将注释添加到地图后手动修改类其他部分中的属性基础变量,请确保在您发送通知时发送通知。Map Kit 使用键值观察 (KVO) 通知来检测注释的 coordinatetitlesubtitle 属性的更改,并对地图进行任何需要的更改显示。如果您不发送 KVO 通知,您的注释位置可能无法在地图上正确更新。"
    • coordinatedocumentation for MKAnnotation中也有描述。
    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多