Swift 在其超类符合该协议的子类中实现委托方法
我已经将谷歌地图API整合到我的应用程序中,一切都很顺利。然而,经过进一步的开发,我意识到我将需要两个不同的ViewController,它们都显示一个Swift 在其超类符合该协议的子类中实现委托方法,swift,delegates,protocols,google-maps-sdk-ios,Swift,Delegates,Protocols,Google Maps Sdk Ios,我已经将谷歌地图API整合到我的应用程序中,一切都很顺利。然而,经过进一步的开发,我意识到我将需要两个不同的ViewController,它们都显示一个GMSMapView,但每个都有稍微不同的功能。我决定创建一个基类,该基类具有公共功能,并且该基类符合GMSMapViewDelegate。在这个基类中,我有: class BaseMapViewController: UIViewController { var mapView = GMSMapView() override
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:CLLocationCoordinate2D)
,所以我只在子类(如下所示)中实现它,但它不注册任何点击
class SellerMapViewController: BaseMapViewController {
override func viewDidLoad(){
super.viewDidLoad()
}
func mapView(mapView: GMSMapView!, didTapAtCoordinate coordinate: CLLocationCoordinate2D) {
print("\(coordinate.latitude,coordinate.longitude)")
}
}
然后我尝试将委托方法放入基类,但它仍然没有注册任何点击。关于我做错了什么或者我可以尝试什么,有什么想法吗
谢谢 听起来可能会发生一些事情:
- 确保将超类设置为委托,而不仅仅是符合协议
- 我在自己的代码中也做过类似的事情,我所做的是在超类中实现一个伪函数,如果调用该函数,它会打印一条消息,说明它的子类需要实现它,这样超类就完全实现了委托方法
- 在子类中实现所需的方法。如果在超类中正确设置了关系,则将在子类中调用这些方法,覆盖超类中的相同调用
- 确保将超类设置为委托,而不仅仅是符合协议
- 我在自己的代码中也做过类似的事情,我所做的是在超类中实现一个伪函数,如果调用该函数,它会打印一条消息,说明它的子类需要实现它,这样超类就完全实现了委托方法
- 在子类中实现所需的方法。如果在超类中正确设置了关系,则将在子类中调用这些方法,覆盖超类中的相同调用
func-mapView(mapView:GMSMapView!,didTapAtCoordinate-coordinate:CLLocationCoordinate2D){print(“在基类中实现!”)}
放在基类中,然后在子类中重写它,但它不起作用。您的代码有一个不同的问题。实际上,您正在将自己设置为对象的委托,但随后调用loadMap(),这将用一个新的映射替换该映射,而您不是该映射的委托。将自己设置为loadMap()中的代理以及。。。那件事我忘了。因此,为了澄清,我使用GMSMapView构造函数初始化mapViewvar mapView=GMSMapView()
,然后将mapView的委托设置为selfmapView.delegate=self
。然后在loadMap()中,当我设置mapViewmapView=GMSMapView(frame:CGRectZero)
时,由于缺少适当的术语,它会覆盖以前的GMSMapView实例,因此会清除mapView的委托属性,并且我必须声明存储在mapView中的新对象将其委托作为self?是的!谢谢你。好消息是我确信我正确地继承了遗产,我想另一个好消息是我犯了一个从中学到的错误,以后不会再犯了。:)再次感谢!我在我的原始帖子中添加了一些代码供参考。我在超类的viewDidLoad()中将超类设置为委托。我将尝试按照您的建议在基类中实现该函数,然后在子类中重写它。根据您的建议,我尝试将func-mapView(mapView:GMSMapView!,didTapAtCoordinate-coordinate:CLLocationCoordinate2D){print(“在基类中实现!”)}
放在基类中,然后在子类中重写它,但它不起作用。您的代码有一个不同的问题。实际上,您正在将自己设置为对象的委托,但随后调用loadMap(),这将用一个新的映射替换该映射,而您不是该映射的委托。将自己设置为loadMap()中的代理以及。。。那件事我忘了。因此,为了澄清,我使用GMSMapView构造函数初始化mapViewvar mapView=GMSMapView()
,然后将mapView的委托设置为selfmapView.delegate=self
。然后在loadMap()中,当我设置mapViewmapView=GMSMapView(frame:CGRectZero)
时,由于缺少适当的术语,它会覆盖以前的GMSMapView实例,因此会清除mapView的委托属性,并且我必须声明存储在mapView中的新对象将其委托作为self?是的!谢谢你。好消息是我确信我正确地继承了遗产,我想另一个好消息是我犯了一个从中学到的错误,以后不会再犯了。:)再次感谢!