Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在其超类符合该协议的子类中实现委托方法_Swift_Delegates_Protocols_Google Maps Sdk Ios - Fatal编程技术网

Swift 在其超类符合该协议的子类中实现委托方法

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

我已经将谷歌地图API整合到我的应用程序中,一切都很顺利。然而,经过进一步的开发,我意识到我将需要两个不同的ViewController,它们都显示一个
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)")
    }
}
然后我尝试将委托方法放入基类,但它仍然没有注册任何点击。关于我做错了什么或者我可以尝试什么,有什么想法吗


谢谢

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

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

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

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

如果没有更多的代码,我很难判断-但委托只是另一个类的属性,因此我认为您应该尝试将委托分配给您的子类实例。如果没有更多的代码,我很难判断-但是委托只是另一个类的属性,因此我认为您应该尝试将委托分配给您的子类实例子类实例。我在我的原始帖子中添加了一些代码供参考。我在超类的viewDidLoad()中将超类设置为委托。我将尝试按照您的建议在基类中实现该函数,然后在子类中重写它。根据您的建议,我尝试将
func-mapView(mapView:GMSMapView!,didTapAtCoordinate-coordinate:CLLocationCoordinate2D){print(“在基类中实现!”)}
放在基类中,然后在子类中重写它,但它不起作用。您的代码有一个不同的问题。实际上,您正在将自己设置为对象的委托,但随后调用loadMap(),这将用一个新的映射替换该映射,而您不是该映射的委托。将自己设置为loadMap()中的代理以及。。。那件事我忘了。因此,为了澄清,我使用GMSMapView构造函数初始化mapView
var mapView=GMSMapView()
,然后将mapView的委托设置为self
mapView.delegate=self
。然后在loadMap()中,当我设置mapView
mapView=GMSMapView(frame:CGRectZero)
时,由于缺少适当的术语,它会覆盖以前的GMSMapView实例,因此会清除mapView的委托属性,并且我必须声明存储在mapView中的新对象将其委托作为self?是的!谢谢你。好消息是我确信我正确地继承了遗产,我想另一个好消息是我犯了一个从中学到的错误,以后不会再犯了。:)再次感谢!我在我的原始帖子中添加了一些代码供参考。我在超类的viewDidLoad()中将超类设置为委托。我将尝试按照您的建议在基类中实现该函数,然后在子类中重写它。根据您的建议,我尝试将
func-mapView(mapView:GMSMapView!,didTapAtCoordinate-coordinate:CLLocationCoordinate2D){print(“在基类中实现!”)}
放在基类中,然后在子类中重写它,但它不起作用。您的代码有一个不同的问题。实际上,您正在将自己设置为对象的委托,但随后调用loadMap(),这将用一个新的映射替换该映射,而您不是该映射的委托。将自己设置为loadMap()中的代理以及。。。那件事我忘了。因此,为了澄清,我使用GMSMapView构造函数初始化mapView
var mapView=GMSMapView()
,然后将mapView的委托设置为self
mapView.delegate=self
。然后在loadMap()中,当我设置mapView
mapView=GMSMapView(frame:CGRectZero)
时,由于缺少适当的术语,它会覆盖以前的GMSMapView实例,因此会清除mapView的委托属性,并且我必须声明存储在mapView中的新对象将其委托作为self?是的!谢谢你。好消息是我确信我正确地继承了遗产,我想另一个好消息是我犯了一个从中学到的错误,以后不会再犯了。:)再次感谢!