Как поймать данные GPS от Func LocationManager? - PullRequest
0 голосов
/ 23 мая 2019

У меня возникли некоторые проблемы с этим UIViewController.Я думал, что viewDidLoad () будет похож на main () в других языках, но особенно в этом случае я не вижу функций, вызываемых в функции viewDidLoad ().

Прежде всего, я полностью сбит с толку var locationManager, который на самом деле является одновременно CLLocationManager и func.Как?

Где я могу вызвать func locationManager?Могу ли я вернуть locValue.latitude и locValue.longitude?Как мне поймать их в viewDidLoad ()?Наконец, я хочу отправить эти два параметра чему-либо после нажатия кнопки (см .: func SendButtonAction).Но моя проблема в том, что я не знаю, как привести этих двух парней из тела func locationManager к входу в func SendButtonAction.

Ценю любую помощь :) Думаю, мне нужно больше базовых знаний.

import UIKit
import MapKit
import CoreLocation

class GPSNew: UIViewController, CLLocationManagerDelegate {


    @IBOutlet weak var mapView: MKMapView!
    @IBOutlet weak var zurueckButton: UIButton!
    @IBOutlet weak var SendButton: UIButton!


    var locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Ask for Authorisation from the User.
        self.locationManager.requestAlwaysAuthorization()

        // For use in foreground
        self.locationManager.requestWhenInUseAuthorization()

        if CLLocationManager.locationServicesEnabled() {
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            locationManager.startUpdatingLocation()
        }

        // Do any additional setup after loading the view.
    }




    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        //guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
        let locValue: CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
        let userLocation = locations.last
        let viewRegion = MKCoordinateRegion(center: (userLocation?.coordinate)!, latitudinalMeters: 600, longitudinalMeters: 600)
        self.mapView.setRegion(viewRegion, animated: true)

        //return (locValue.latitude, locValue.longitude)
    }



    @IBAction func SendButtonAction(_ sender: Any) {
        //send the user location to something
        //end updating location
        locationManager.stopUpdatingLocation()
    }
}

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

По вашему вопросу это звучит так, как будто вы привыкли к процедурному программированию.Например, в утилите командной строки C у вас есть функция main(), которая вызывается во время запуска.Main вызывает другие функции для выполнения настройки, затем может иметь цикл, который выполняет пошаговую работу, которую он должен выполнить, а затем либо выполняет цикл, ожидая ввода от пользователя, либо возвращает, если это утилита "все готово".

Приложения для большинства (всех?) ОС на основе графического интерфейса не работают таким образом.Они основаны на событиях и обычно используют объектно-ориентированный дизайн.Вы должны прочитать о разработке, управляемой событиями.Пока вы его не изучите, вы будете очень сбиты с толку и не сможете сойти с толку.

Вот краткое введение в концепции, но это гораздо более глубокая тема, чем мыможно описать в простом посте:

В объектно-ориентированной, управляемой событиями программе вы создаете объекты, у которых есть методы (функции), которые реагируют на происходящие события.Ваша программа определяет набор начальных объектов, а затем эти объекты ждут, когда что-то произойдет.

Метод viewDidLoad() является примером метода, который вызывается, когда что-то происходит.Он вызывается, когда создается представление контроллера (объекта, который управляет видом).Это дает вам возможность выполнить однократную настройку, чтобы пользователь мог «делать что-то».Ваша функция viewDidLoad () выполняет эту однократную настройку, а затем возвращает.

Затем управление возвращается в систему, и ваше приложение просто ждет повторного вызова.

Вы также можете добавить методы, которые реагируют на нажатия пользователем кнопок, скольжения, уведомлений об обновленных местоположениях GPS.и т. д.

Диспетчер местоположения (CLLocationManager) - это объект, который вы создаете, когда хотите получить информацию о местонахождении устройства.Вы создаете один и просите его уведомить вас о различных типах событий местоположения.Вы устанавливаете объект, чтобы быть "делегатом" менеджера местоположения.Это все равно, что дать менеджеру местоположения номер телефона и сказать «позвоните по этому номеру, когда местоположение пользователя изменится».

Менеджер местоположений вызывает своего делегата, когда происходят события, о которых вы сказали, что вам небезразлично.

0 голосов
/ 23 мая 2019

На самом деле метод определения местоположения является асинхронным, поэтому вы можете попробовать

@IBAction func sendButtonAction(_ sender: Any) { 
    if let loc =  locationManager.location?.coordinate {
       print(loc.latitude, loc.longitude)
       locationManager.stopUpdatingLocation()
    }
} 
...