0
請看看Renderer類的兩個版本。 Renderer1的初始化器成功執行。 Renderer2的初始化程序在對super.init的調用中崩潰。崩潰消息中引用的init(overlay :)初始化器由MKOverlayRenderer聲明,它是類層次結構上的3個層次。爲什麼使用便捷初始化工修復了我的問題?
import UIKit
import MapKit
class ViewController: UIViewController {
class Renderer1 : MKPolylineRenderer {
convenience init(polyline: MKPolyline, lineWidth: CGFloat) {
self.init(polyline: polyline)
self.lineWidth = lineWidth
}
}
class Renderer2 : MKPolylineRenderer {
// Crash Message:
// /Users/Robert/Temp/Test/Test/ViewController.swift: 22: 11: fatal error: use of unimplemented initializer 'init(overlay:)' for class 'Test.Renderer2'
// 2017-10-06 08:37:10.582531-0400 Test[2962:932545] /Users/Robert/Temp/Test/Test/ViewController.swift: 22: 11: fatal error: use of unimplemented initializer 'init(overlay:)' for class 'Test.Renderer2'
init(polyline: MKPolyline, lineWidth: CGFloat) {
super.init(polyline: polyline) // <= Crashes Here!
self.lineWidth = lineWidth
}
}
private var renderer1: Renderer1? = nil
private var renderer2: Renderer2? = nil
override func viewDidLoad() {
super.viewDidLoad()
var coordinates = [CLLocationCoordinate2D]()
for latitude in 1 ... 10 {
coordinates.append(CLLocationCoordinate2D(latitude: CLLocationDegrees(latitude), longitude: 0))
}
let polyline = MKPolyline(coordinates: coordinates, count: coordinates.count)
renderer1 = Renderer1(polyline: polyline, lineWidth: 10)
renderer2 = Renderer2(polyline: polyline, lineWidth: 10)
}
}
有人請幫我理解這裏發生了什麼嗎?
看起來像一個bug給我; 'MKPolylineRenderer'應該在'super'而不是'self'上調用'init(overlay:)'。因爲你在'Renderer2'中定義了一個指定的初始化器,所以你不會隱式地繼承'init(overlay:)'的實現。 – Hamish
雖然請注意['MKPolylineRenderer'](https://developer.apple.com/documentation/mapkit/mkpolylinerenderer)的文檔說「*您通常使用此類,並且不會繼承它*」。 – Hamish