Swift 3.0 Получить координаты местоположения пользователя из другого контроллера просмотра

У меня есть два контроллера вида – один с mapView, который может получить координаты местоположения пользователя через locationManager и второй VC, который я хочу, чтобы вытащить эти пользовательские координаты.

Первый VC: MapView

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { var coordinatesOfUser = locations.last?.coordinate print("The value of usercoordinates are \(coordinatesOfUser)") // here I want to be able to pull this variable, coordinatesOfUser if let location = locations.last { let span = MKCoordinateSpanMake(0.00775, 0.00775) let myLocation = CLLocationCoordinate2DMake(location.coordinate.latitude,location.coordinate.longitude) let region = MKCoordinateRegionMake(myLocation, span) map.setRegion(region, animated: true) } self.map.showsUserLocation = true locationManager.stopUpdatingLocation() } 

Второй VC:

Я думал о вызове функции locationManager в этом VC. Это самый эффективный способ вывести координаты на этот VC? И если да, то как мне это сделать?

Вот несколько вариантов решения этой проблемы:

Делегирование : у вашего secondVC может быть делегат, который позволяет первому контроллеру представления получать от него координаты. Преимущество здесь в том, что вы можете получать обновления по мере поступления.

 protocol MyLocationDelegate: class { func newLocationArrived(location: CLLocation) } class FirstVC: UIViewController, MyLocationDelegate { override func viewDidLoad() { super.viewDidLoad() } func newLocationArrived(location: CLLocation) { print(location) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let dest = segue.destination as? SecondVC { dest.delegate = self } } } class SecondVC: UIViewController, CLLocationManagerDelegate { /// ... ... weak var delegate: MyLocationDelegate? func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { /// do something with the location /// provide the data via delegation delegate?.newLocationArrived(location: CLLocation()) } } 

Уведомления : отправьте уведомление через NSNotificationCenter. Также, чтобы получать обновления, входящие в систему, просто отправьте через центр уведомлений, а не через делегата.

postNotificationName: объект: USERINFO:

Child View Controller : В зависимости от того, является ли второй контроллер представления и его представление дочерним по отношению к первому, это может обеспечить прямой доступ. Не всегда вариант.

Singleton (CLLocationManager) : если вы планируете использовать службы определения местоположения в других местах всего приложения, вы можете переместить CLLocationManager в свой собственный класс с помощью Singleton. Другие контроллеры представлений могут ссылаться на этот класс для своих конкретных потребностей. Это также может быть полезно при использовании фона или значительных мест изменения, поскольку им может понадобиться использовать LaunchOptions Key для перезапуска менеджера местоположений.

 class MyLocationManager: CLLocationManager, CLLocationManagerDelegate { static let shared = MyLocationManager() var locations = [CLLocation]() func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { for location in locations { self.locations.append(location) } } } 

У меня была такая же проблема, и я, наконец, исправил ее с уведомлением, как сказал kuhncj.

Вот как выглядит код в конце:

  //Get user location func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { if status == .authorizedWhenInUse { locationManager.startUpdatingLocation() mapView.isMyLocationEnabled = true mapView.settings.myLocationButton = true } else { initialLocation() } } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if let location = locations.first { mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 15, bearing: 0, viewingAngle: 0) locationManager.stopUpdatingLocation() let userInfo: NSDictionary = ["location": location] //Post notification NotificationCenter.default.post(name: NSNotification.Name("UserLocationNotification"), object: self, userInfo: userInfo as [NSObject : AnyObject]) } } 

А затем в другом контроллере представления:

  var userLocation: String? override func viewDidLoad() { super.viewDidLoad() //Observer that receives the notification NotificationCenter.default.addObserver(self, selector: #selector(locationUpdateNotification), name: Notification.Name("UserLocationNotification"), object: nil) } func locationUpdateNotification(notification: NSNotification) { if let userInfo = notification.userInfo?["location"] as? CLLocation { //Store user location self.userLocation = "\(userInfo.coordinate.latitude), \(userInfo.coordinate.longitude)" } } 

Затем я смог использовать сохраненный userLocation для других методов.

  • Соответствует UITableViewDelegate и UITableViewDatasource в Swift?
  • CAShapeLayer с UIBezierPath
  • Могу ли я сделать тень, которая может просматривать прозрачный объект с помощью сценки и аркита?
  • KerberosKey в Swift
  • Сделать все конечные точки ожидания одной точной конечной точкой
  • chartValueSelected никогда не вызывается
  • Сериализация класса Swift для JSON с использованием J2ObjC и библиотеки GSON
  • SpriteKit playSoundFileNamed crash на iOS 8.3
  • Вызов CLLocationManager AuthorizationStatus?
  • Обработка ошибок CloudKit
  • Как получить ссылку keyWindow в быстром приложении?
  • Interesting Posts

    Swift: коснитесь части текста UILabel

    Ошибка «календарь не имеет источника» при создании нового календаря с использованием EventKit в ios 6

    Анимационный просмотр события UIKeyboardWillShowNotification в iOS 8

    Является ли iOS чистыми элементами связки ключей автоматически?

    H264 Потоковое видео по RTMP на iOS

    PNG изображения нормально на симуляторе, но не отображаются на устройстве

    "Ошибка: базовый модуль Objective-C <модуль> не найден"

    ios удалить клавиатуру

    Строка JSON из NSDictionary, имеющая путь к файлу

    iOS 9.2: Не удается доверять приложению вручную, нет опции профиля

    Как узнать, когда безопасно игнорировать __cxa_throw на контрольной точке All Exceptions?

    Совместное использование с интеграцией Facebook iOS 6.0: «Отправлено через мое имя приложения»?

    Регистрация для удаленных уведомлений при входе пользователя в

    React Native 0.26 Не найдено подходящего загрузчика URL-адреса изображения при отображении изображения из библиотеки объектов

    Создание CocoaPod из существующего проекта Xcode

    Давайте будем гением компьютера.