如何对重命名的类进行子类化? / 'MKPinAnnotationView' 在 iOS 15.0 中被弃用:重命名为 'MKMarkerAnnotationView'

问题描述

MKPinAnnotationView 在 iOS 15 中被重命名MKMarkerAnnotationView
在 iOS 14 之前,我将 MKPinAnnotationView 子类化为

class MyAnnotationView: MKPinAnnotationView {
// …
}  

问题:
如果我的应用编译到 iOS 14,我想声明 MyAnnotationView 如上。
但是如果编译到iOS 15,我必须使用

class MyAnnotationView: MKMarkerAnnotationView {
// …
}  

如何实现?

在指令层面,我可以使用类似的东西

if #available(iOS 15,*) {
// iOS 15
} else {
// iOS 14
}  

但在班级层面,显然只有类似

@available(iOS 15,*)
class MyAnnotationView: MKMarkerAnnotationView {   

如果 iOS 15 可用,似乎可以让我编译一个类,但显然我无法避免编译 class MyAnnotationView: MKPinAnnotationView { 如果 iOS 15 可用。

那么这在 Swift 中是如何处理的?

解决方法

正如 @Paulw11 在其他答案中所指出的,MKMarkerAnnotationViewiOS 11 以来一直可用。因此无需在 iOS 15 上使用它。


这部分仍然与其他情况相关,例如 @dfdiOS 14 和更早版本中提到的图像选择器。


虽然没有想象中的那么漂亮,但还是值得一试。

import MapKit

#if canImport(CoreLocationUI) // Hack for iOS 15?
public typealias BaseAnnotationView = MKMarkerAnnotationView
#else
public typealias BaseAnnotationView = MKPinAnnotationView
#endif

class MyAnnotationView: BaseAnnotationView {
    
}
,

MKPinAnnotationView 尚未重命名。

MKPinAnnotationView 在 iOS 15 中已弃用,但您仍然可以使用它。弃用只是意味着不建议您将其用于新应用,它可能会在未来消失,您不能指望有任何增强。

MKMarkerAnnotationView 从 iOS 11 开始可用,因此除非您的应用面向 iOS 10 或更早版本,否则您只需切换到使用它而不是 MKPinAnnotationView