Ios swift中的observeValueForKeyPath崩溃应用程序

Ios swift中的observeValueForKeyPath崩溃应用程序,ios,swift,Ios,Swift,我对iOS开发非常陌生,我一直在试图弄清楚为什么我的应用程序会因为SIGABRT的消息而崩溃。我正在跟随一个关于如何实现GoogleMapsSDK的教程(),据我所知,我有相同的代码 我的代码: @IBOutlet weak var mapView: GMSMapView! let locationManager = CLLocationManager() var didFindMyLocation = false override func viewDidLoad() { supe

我对iOS开发非常陌生,我一直在试图弄清楚为什么我的应用程序会因为SIGABRT的消息而崩溃。我正在跟随一个关于如何实现GoogleMapsSDK的教程(),据我所知,我有相同的代码

我的代码:

@IBOutlet weak var mapView: GMSMapView!

let locationManager = CLLocationManager()
var didFindMyLocation = false

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    locationManager.requestWhenInUseAuthorization()
    locationManager.delegate = self

    mapView.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.New, context: nil)

    }

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if status == CLAuthorizationStatus.AuthorizedWhenInUse {
        mapView.myLocationEnabled = true
    }
}

private func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
    if !didFindMyLocation {
        let myLocation: CLLocation = change[NSKeyValueChangeNewKey] as! CLLocation
        mapView.camera = GMSCameraPosition.cameraWithTarget(myLocation.coordinate, zoom: 10)
        mapView.settings.myLocationButton = true

        didFindMyLocation = true
    }
}
@ibsvar映射视图:GMSMapView!
让locationManager=CLLocationManager()
var didFindMyLocation=false
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后执行任何其他设置。
locationManager.RequestWhenUseAuthorization()
locationManager.delegate=self
addObserver(self,forKeyPath:“myLocation”,选项:NSKeyValueObservingOptions.New,上下文:nil)
}
func locationManager(经理:CLLocationManager,didChangeAuthorizationStatus:CLAuthorizationStatus){
如果状态==CLAuthorizationStatus.AuthorizedWhenInUse{
mapView.myLocationEnabled=true
}
}
private func observeValueForKeyPath(键路径:字符串,对象对象:AnyObject,更改:[NSObject:AnyObject],上下文:UnsafeMutablePointer){
如果!发现了错配{
让myLocation:CLLocation=将[NSKeyValueChangeNewKey]更改为!CLLocation
mapView.camera=GMSCameraPosition.cameraWithTarget(myLocation.coordinate,缩放:10)
mapView.settings.myLocationButton=true
didFindMyLocation=true
}
}
崩溃发生在我添加最后一个函数observeValueForKeyPath时,我不知道为什么。我收到以下错误消息:

由于未捕获的异常“NSInternalInconsistencyException”,正在终止应用程序,原因:':接收到但未处理-observeValueForKeyPath:ofObject:change:context:消息。 关键路径:myLocation


有人能告诉我我做错了什么吗

问题在于您没有正确声明observeValueForKeyPath(\uOfObject:change:context:)。您的方法要求对象的
keyPath
change
使用错误的参数类型

你没有声明你的方法
override
这一事实就是一个线索:如果你用正确的类型声明了它,编译器会告诉你它也需要声明
override
。(它还会告诉您不能将其声明为
private
,因为它在
NSObject
中是
public

正确的声明如下所示:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?,
    change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)
重写函数observeValueForKeyPath(键路径:String?,对象对象:AnyObject?,
更改:[字符串:AnyObject]?,上下文:UnsafeMutablePointer)
如果您刚开始在类范围中键入方法名称,Xcode将提供自动完成正确声明的功能:


问题在于您没有正确声明
observeValueForKeyPath(\uOfObject:change:context:)
。您的方法要求对象的
keyPath
change
使用错误的参数类型

你没有声明你的方法
override
这一事实就是一个线索:如果你用正确的类型声明了它,编译器会告诉你它也需要声明
override
。(它还会告诉您不能将其声明为
private
,因为它在
NSObject
中是
public

正确的声明如下所示:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?,
    change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)
重写函数observeValueForKeyPath(键路径:String?,对象对象:AnyObject?,
更改:[字符串:AnyObject]?,上下文:UnsafeMutablePointer)
如果您刚开始在类范围中键入方法名称,Xcode将提供自动完成正确声明的功能:


非常感谢!成功了,非常感谢!成功了。