2017-02-23 55 views
0

我有一个符合NSObject, MKMapViewDelegate的子类 - 并已将其分配给mapView.delegate属性,但委托方法没有被调用。我如何正确地将MKMapViewDelegate进行子类化并将该类设置为委托?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 - 该方法会被调用。所以我假设我要么没有正确的继承或正确地实例化子类。

+1

地图视图将不保留其委托,所以您创建的委托会在之后立即解除分配。您必须将其保存在视图控制器的属性中。 – dan

+1

模糊了swift如何处理这个问题,但是这会由于weak引用而导致在objective-c中产生,以及您没有任何事物持有委托对象,因此只要该函数离开作用域就会释放它。 ..只是一个想法... – Mike

+0

@丹该死......你打败了我:) – Mike

回答

0

我认为这是由于弱引用和事实,你没有任何东西持有的委托对象,所以它被释放,只要该函数离开范围。在内部,一个对象应该总是有一个对它的委托的弱引用来避免保留周期,但是如果你想要一个非self以外的对象作为委托,你需要一个强大的引用。

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

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