【问题标题】:MKMapViewDelegate subclass method not called未调用 MKMapViewDelegate 子类方法
【发布时间】:2017-07-14 09:59:39
【问题描述】:

我有一个符合NSObject, MKMapViewDelegate- 的子类,并将其分配给mapView.delegate 属性,但是没有调用委托方法。如何正确继承 MKMapViewDelegate 并将该类设置为委托?

import UIKit
import MapKit

class HomeVC: ViewController {
    @IBOutlet weak var mapView: MKMapView! didSet { 
        mapView.delegate = MyMapViewDelegate() 
    }
}

class MyMapViewDelegate: NSObject, MKMapViewDelegate {
  func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

    print("Not being called")

    return renderer
  }
}

当我让 HomeVC 符合 MKMapViewDelegate 时 - 该方法将被调用。所以我假设我没有正确子类化或正确实例化子类化对象。

【问题讨论】:

  • 地图视图不会保留其委托,因此您创建的委托会在之后立即被释放。您必须将其保存在视图控制器的属性中。
  • 模糊处理这个问题的速度,但这会在objective-c中由于弱引用和你没有任何东西持有委托对象的事实而引起,所以它被释放为一旦该功能离开范围......只是一个想法......
  • @dan 该死的......你打败了我 :)
  • 欣赏!小事总是惹事的哈哈

标签: ios swift inheritance mapkit subclass


【解决方案1】:

我认为这是由于弱引用和您没有任何东西持有委托对象的事实,所以一旦该函数离开范围,它就会被释放。在内部,对象应始终对其委托具有弱引用以避免保留循环,但如果您希望 self 以外的对象作为委托,则需要具有强引用的对象。

我相信这可以通过在您的视图控制器中创建一个委托属性来解决,以便对该对象具有强引用...

class HomeVC: ViewController {
    let mapViewDelegate = MyMapViewDelegate()
    ...
}

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2011-10-24
    相关资源
    最近更新 更多