Ошибка EXC Bad Instruction пытается получить текущее местоположение из другого класса?

У меня был Massive View Controller и я пытался разделить мой код на разные классы. Я создал класс CurrentLocation. В контроллере вида я вызвал метод google maps animateToLocation, и я получил плохую инструкцию EXC. Сделали немало исследований по правильной архитектуре приложения, но все еще новы и учимся на опыте. Использование Google Maps для iOS и попытка реализовать это правильно. Допустимо ли помещать место обновления в отдельный класс от ViewController. Затем просто вызывать методы, которые я хочу вызвать в ViewController? Я думаю, что правильно реализовал Model-View-Controller и, возможно, просто унаследовал то, чего не должен был иметь. Должно быть простое исправление, просто не знаю, с чего начать.

import UIKit
import GoogleMaps

class ViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate {

@IBOutlet weak var googleMapView: GMSMapView!

let locationManager = CLLocationManager()
let currentLocation = CurrentLocation()

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

override func viewDidAppear(animated: Bool)
 {
    super.viewDidAppear(animated)

    if CLLocationManager.locationServicesEnabled() {
        googleMapView.myLocationEnabled = true

        googleMapView.animateToLocation(currentLocation.coordinate) // EXC Bad Instruction
    } else
    {
        locationManager.requestWhenInUseAuthorization()
    }

}



import Foundation
import CoreLocation
import GoogleMaps

class CurrentLocation: NSObject,CLLocationManagerDelegate {

override init()
{
    super.init()
}

var locationManager = CLLocationManager()

var location   : CLLocation!
var coordinate : CLLocationCoordinate2D!
var latitude   : CLLocationDegrees!
var longitude  : CLLocationDegrees!

 func trackLocation()
{
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()
}


func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
{

    if CLLocationManager.locationServicesEnabled() {
        location   = locations.last
        coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
        latitude   = coordinate.latitude
        longitude  = coordinate.longitude
    }

}

1 ответ

Решение

Эта ошибка происходит потому, что currentLocation.coordinate является nil и вы обращаетесь к нему как к неявно развернутому необязательному. По сути, вы пытаетесь получить доступ к переменной, прежде чем она будет в чем-либо. Вам нужно инициализировать CLLocationManager, попросите разрешения, а затем начните обновлять местоположение. Проверьте эту замечательную рецензию от NSHipster: Core Location в i OS 8.

Другие вопросы по тегам