2016-01-29 4 views
1

Я очень новичок в разработке iOS и пытаюсь оборачивать голову тем, почему мое приложение рушится с сообщением SIGABRT. Я следую инструкциям (link) о том, как реализовать SDK Google Maps, и насколько я могу судить, у меня есть тот же код.watchValueForKeyPath сбойное приложение в swift

Мой код:

@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 
    } 
} 

Катастрофа происходит, когда я добавляю последнюю функцию observeValueForKeyPath, и я не могу понять, почему. Я получаю следующее сообщение об ошибке:

Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: ': An -observeValueForKeyPath: ofObject: change: context: сообщение получено, но не обработано. Путь по ключению: myLocation

Может кто-нибудь сказать мне, что я делаю неправильно?

ответ

6

Проблема в том, что вы не указали observeValueForKeyPath(_:ofObject:change:context:) правильно. Ваш метод ожидает неправильные типы аргументов для keyPath, ofObject и change.

Тот факт, что вы не объявили свой метод override, является ключом: если вы объявили его с правильными типами, компилятор скажет вам, что он также должен быть объявлен override. (Было бы также сказать вам, что вы не можете объявить его private, потому что это public в NSObject.)

Правильное заявление выглядит следующим образом:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, 
    change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) 

Если вы только начинаете вводить имя метода в области видимости класса , Xcode предложит автозаполнение правильное заявление:

Xcode autocomplete

+0

большое спасибо! Так оно и было. – Amalie