Приложение аварийно завершает работу при запуске более одного раза в GMSMAPVIEW - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть приложение, которое находит места рядом с местоположением пользователя, однако приложение аварийно завершает работу во второй раз, за ​​исключением: фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения. Онлайн: self.googleMapView.animate (toLocation: координаты)

Я проверил, и googleMapView равен нулю, но я не понимаю, как он равен нулю или как он запускался в первый раз. Он начинает падать только при последующих попытках, если я удаляю и переустанавливаю приложение, оно отлично работает с первой попытки, но после этого продолжает сбой, даже если я перезапускаю приложение. Полный код ниже

import UIKit
import GoogleMaps
import GooglePlacePicker
import MapKit

 class MapViewController: UIViewController, CLLocationManagerDelegate {
var currentLongitude: CLLocationDegrees = 0
var currentLatitude: CLLocationDegrees = 0
var locationManager: CLLocationManager!
var placePicker: GMSPlacePickerViewController!
var googleMapView: GMSMapView!

@IBOutlet weak var mapViewContainer: MKMapView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.googleMapView = GMSMapView(frame: self.mapViewContainer.frame)
    self.googleMapView.animate(toZoom: 18.0)
    self.view.addSubview(googleMapView)
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.locationManager = CLLocationManager()
    self.locationManager.delegate = self
    self.locationManager.requestAlwaysAuthorization()
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let location:CLLocation = locations.last {
        self.currentLatitude = location.coordinate.latitude
        self.currentLongitude = location.coordinate.longitude
    }
    else {
        print("Location Error")
    }

    let coordinates = CLLocationCoordinate2DMake(self.currentLatitude, self.currentLongitude)
    let marker = GMSMarker(position: coordinates)
    marker.title = "I am here"
    marker.map = self.googleMapView
    self.googleMapView.animate(toLocation: coordinates)
}



private func locationManager(manager: CLLocationManager,
                     didFailWithError error: Error){
    print("An error occurred while tracking location changes : \(error.localizedDescription)")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

1 Ответ

0 голосов
/ 02 ноября 2018

Сбой довольно очевиден:

Вы задаете делегата своего местоположения в viewDidLoad, но создаете карту в viewDidAppear.

Если местоположение было известно iOS, вы получите сообщение до того, как viewDidAppear позвонит, поэтому в строке: self.googleMapView.animate(toLocation: coordinates), ваша карта по-прежнему nil

Вы можете либо указать свою карту как необязательную: var googleMapView: GMSMapView?, либо подождать, пока ваша карта будет определена для создания вашего менеджера местоположений.

...