Swift 2 MKMapViewDelegate rendererForOverlay 可选性

Posted

技术标签:

【中文标题】Swift 2 MKMapViewDelegate rendererForOverlay 可选性【英文标题】:Swift 2 MKMapViewDelegate rendererForOverlay optionality 【发布时间】:2015-06-10 08:04:14 【问题描述】:

在 Swift 1.2 中我有这个:

class UVC: NSViewController, MKMapViewDelegate 
    // ...

    // **************************************
    // MARK: MapView Delegate
    // **************************************
    func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer! 
        if overlay is OSGBTiles 
            return OSGBTilesRenderer(tileOverlay: overlay as! OSGBTiles)
         else if overlay is ESRI 
            return ESRIRenderer(shapeFileOverlay: overlay as! ESRI)
         else if overlay is MKTileOverlay 
            return MKTileOverlayRenderer(overlay: overlay)
         else 
            print("Unknown overlay")
        
        return nil
    

Swift 2 将mapView:rendererForOverlay 的定义更改为现在返回MKOverlayRenderer 而不是MKOverlayRenderer!,并且现在不允许我返回nil(不出所料),因为MKOverlayRenderer 不是NilLiteralConvertible。但是,文档(在 Xcode 7 中)仍然说:

返回值

呈现指定叠加层时使用的渲染器 在地图上。如果返回 nil,则不为指定的内容绘制任何内容 覆盖对象。

如果通过了我不认识的叠加层,我应该返回什么?

【问题讨论】:

【参考方案1】:

根据最新的MKMapView.h,新的函数声明现在是:

// Current renderer for overlay; returns nil if the overlay is not shown.
@available(ios 7.0, *)
func rendererForOverlay(overlay: MKOverlay) -> MKOverlayRenderer?

【讨论】:

不确定你说的是哪个功能。我说的是协议函数func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer! 哦,对不起,我的错误。有趣的是,即使是 ObjC 版本也指定了非空返回。我正在继续寻找这个问题的答案...... 其实我刚刚提交了错误 #21581742。 这是 Bug ID# 21581742 的后续。工程部门已根据以下信息确定此问题的行为符合预期:将传递给此的唯一覆盖将是您的覆盖'已添加;没有“无法识别的覆盖”之类的东西。如果开发人员添加了叠加层,则必须提供渲染器——这就是 API 的工作方式。我们认为这个问题已经结束。如果您对此问题有任何疑问或疑虑,请直接更新您的报告 (bugreport.apple.com)。 感谢您研究这个@MarkKnopper!

以上是关于Swift 2 MKMapViewDelegate rendererForOverlay 可选性的主要内容,如果未能解决你的问题,请参考以下文章

GEOSwift 和 MapviewOverlays (Swift)

Swift 中的 MapKit

如何在 Swift 中使用 MKPolylineView

Swift - 关于导入包与类

未调用 MKMapViewDelegate 子类方法

(Swift 3)如何向MapView添加多个引脚