При использовании менеджера местоположений в xcode / swift, чтобы получить текущее местоположение пользователя, я получаю значение nil.Какие-либо предложения? - PullRequest
0 голосов
/ 24 сентября 2019

* ОБНОВЛЕНИЕ: Теперь получение данных о местоположении, и оператор печати print("\(currentLocation.coordinate.latitude)") работает.Если я пытаюсь присвоить то, что находится справа от символа = значению label.text, я получаю сообщение об ошибке: неожиданно обнаружен ноль при развертывании необязательного значения.* Все еще новичок во всей этой вещи Swift / Xcode.Любая помощь будет принята с благодарностью.Я запускаю следующий код (только код, относящийся к указанной проблеме).Когда пользователь нажимает кнопку и выбирает получить местоположение, он должен получить свое местоположение.Вместо этого я ничего не получаю.Текст в locationManager никогда не печатается, и я в растерянности.

import UIKit
import MapKit
import CoreLocation
import MessageUI
import Photos
import AVFoundation

class ViewController: UIViewController, UITextViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, CLLocationManagerDelegate, MFMailComposeViewControllerDelegate {
    var locationManager: CLLocationManager()
    var currentLocation: CLLocation?

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.requestWhenInUseAuthorization()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let currentLocation = locations[0]
        print("\(currentLocation.coordinate.latitude)")
        issueLocation.text = "\(currentLocation.coordinate.latitude)" ***ERROR***
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Error: \(error)")
    }

Вещи, которые не имеют значения, я надеюсь, и больше кода

    // Attach a location
    @IBAction func attachLocation(_ sender: UIButton) {
        if issueLocation.text == nil {
            issueImage.isHidden = true
        }

        let alertController = UIAlertController(title: "Location options", message: nil, preferredStyle: .actionSheet)

        // Get location
        let locationAction = UIAlertAction(title: "Get location", style: .default) { (action) in
            self.displayLocation()

        }    

        // Add get location action to alert controller
        alertController.addAction(locationAction)

        // Remove location
        let eraseLocation = UIAlertAction(title: "Erase location", style: .default) { (action) in
            self.issueLocation.text == nil
            self.issueLocation.isHidden = true
        }

        // Add erase location to alert controller
        alertController.addAction(eraseLocation)

        // Cancel action
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (action) in
            // Do nothing
        }

        // Add cancel action to alert controller
        alertController.addAction(cancelAction)

        // Display alert message on screen
        self.present(alertController, animated: true) {
            // Code to handle user selection
        }
    }

    func displayLocation() {
        let status = CLLocationManager.authorizationStatus()
        let noPermissionMessage = "It appears that LoCAL Information does not have access to your location. Click Settings -> LoCAL Information -> Location to allow access to your location."

        switch status {
        case .notDetermined:
            locationManager?.requestWhenInUseAuthorization()
        case .authorized, .authorizedAlways, .authorizedWhenInUse:
            print("JJJJJ")
            print("KKKKK")
            issueLocation.isHidden = false
        case .denied, .restricted:
            self.troubleAlert(message: noPermissionMessage)
        @unknown default:
            self.troubleAlert(message: noPermissionMessage)
        }

    }

1 Ответ

1 голос
/ 24 сентября 2019

locationManager объявлено, но не инициализировано

Замените

var locationManager: CLLocationManager?

на

let locationManager = CLLocationManager()

и снимите знак вопроса после каждого вхождения locationManager

...