未调用 MKMapViewDelegate 子类方法

Posted

技术标签:

【中文标题】未调用 MKMapViewDelegate 子类方法【英文标题】:MKMapViewDelegate subclass method not called 【发布时间】: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 该死的......你打败了我 :) 欣赏!小事总是惹事的哈哈 【参考方案1】:

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

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

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

【讨论】:

以上是关于未调用 MKMapViewDelegate 子类方法的主要内容,如果未能解决你的问题,请参考以下文章

可扩展设计:如何做到增加功能不修改调用方代码?

如果子类未定义构造函数,是不是会调用父构造函数?

未调用 AWS API Gateway 自定义授权方

UIView 子类:drawRect 未调用

使用 UIGestureRecogniser 子类化时未调用 Touches Ended

UINavigationController 子类未按预期调用 willShowViewController