【问题标题】:How to subclass a renamed class? / 'MKPinAnnotationView' was deprecated in iOS 15.0: renamed to 'MKMarkerAnnotationView‘如何对重命名的类进行子类化? /“MKPinAnnotationView”在 iOS 15.0 中已弃用:重命名为“MKMarkerAnnotationView”
【发布时间】:2021-09-03 22:45:16
【问题描述】:

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 可用,似乎可以让我编译一个类,但如果 iOS 15 可用,我显然无法避免编译 class MyAnnotationView: MKPinAnnotationView {

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

【问题讨论】:

  • 赞成。评论是因为我想知道答案。我的问题涉及使用从 iOS14 开始可用的东西 - 我的应用程序需要 iOS 12。我唯一的答案是创建 两个 子类,这可能有助于我使用 更好的东西来解决它 你发现了什么。

标签: ios swift conditional-compilation availability


【解决方案1】:

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


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


没有它应该的那么漂亮,无论如何都值得一试。

import MapKit

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

class MyAnnotationView: BaseAnnotationView {
    
}

【讨论】:

  • 不确定它是否会起作用(听起来应该),但像我刚刚提出的问题一样赞成您的回答。我将尝试解决涉及 iOS 14 中引入的新图像选择器的问题。是的,一个 hack,但比根据用户使用的 iOS 版本在代码中乱扔条件要好得多。希望它适用于 OP!
  • 虽然是 hack,但它解决了一般问题 (+1)。
【解决方案2】:

MKPinAnnotationView 尚未重命名。

MKPinAnnotationView 在 iOS 15 中已弃用,但您仍然可以使用它。弃用只是意味着不建议您将其用于新应用程序,它可能会在未来消失并且您无法期待任何增强功能。

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

【讨论】:

  • 我不想使用已弃用的代码,但感谢 MKMarkerAnnotationView 早先可用的提示 (+1)。因此,Xcode 13 警告“'MKPinAnnotationView' 在 iOS 15.0 中已被弃用:重命名为'MKMarkerAnnotationView'”具有误导性。但一般问题仍然存在。
  • @ReinhardMänner 这不是误导。第一个 A 存在;那么通常存在一个时期,在此期间 A 及其预期的替代 B 存在;然后,有时经过多年的共存,A 被弃用;最后,甚至比这更晚的一段时间,A 被删除。
  • @matt 我认为“重命名为 ...”当它没有被重命名而是被替换时会产生误导。
  • @ReinhardMänner 啊。把它分成两部分。第 1 部分:“它已被弃用。”你:“哦,天哪,我现在该怎么办?”第 2 部分:“不要害怕:有一个替代名称。”所以你看,他们是在帮助你,而不是误导你。
  • “重命名”是一个糟糕的词选择。它应该说“替换为”或类似的。
猜你喜欢
  • 2019-11-27
  • 2021-11-18
  • 2015-01-30
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多