在超类符合Swift协议的子类中实现Delegate方法

时间:2016-03-03 04:32:23

标签: swift delegates protocols google-maps-sdk-ios

我已将GoogleMaps API整合到我的应用中,一切顺利。然而,经过一些开发后,我意识到我需要有两个不同的ViewControllers,它们都显示GMSMapView,但每个都有不同的功能。我决定创建一个具有通用功能的基类,并且基类符合GMSMapViewDelegate。在这个基类中,我有其他的东西:

class BaseMapViewController: UIViewController {

    var mapView = GMSMapView()

    override func viewDidLoad() {
        super.viewDidLoad()
        mapView.delegate = self

        loadMap()
    }

    func loadMap() {
        mapView = GMSMapView(frame: CGRectZero)
        mapView.mapType = kGMSTypeHybrid
        self.view = mapView
    }
}

extension BaseMapViewController: GMSMapViewDelegate {}

其中一个子类需要实现func mapView(mapView: GMSMapView!, didTapAtCoordinate coordinate: CLLocationCoordinate2D)所以我只是在子类中实现它(如下所示),但它没有注册任何抽头。

class SellerMapViewController: BaseMapViewController {

    override func viewDidLoad(){
        super.viewDidLoad()
    }

    func mapView(mapView: GMSMapView!, didTapAtCoordinate coordinate: CLLocationCoordinate2D) {
        print("\(coordinate.latitude,coordinate.longitude)")
    }
}

然后我尝试将该委托方法放在基类中,它仍然没有注册任何点击。关于我做错了什么或我能尝试什么的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

听起来可能会发生一些事情:

  • 确保将超类设置为委托,而不仅仅是符合协议。
  • 我在自己的代码中做了类似的事情,我所做的是在超类中实现一个虚函数,如果调用它会打印一个消息,其子类需要实现它,以便超类完全实现委托方法。
  • 在子类中实现所需的方法。如果在超类中正确设置了关系,那么将在子类中调用这些方法,覆盖超类中的相同调用。