【问题标题】:How to catch GPS data of func LocationManager?如何捕获 func LocationManager 的 GPS 数据?
【发布时间】:2019-10-09 10:45:48
【问题描述】:

我在整个 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()
    }
}

【问题讨论】:

  • 函数名以小写开头

标签: ios swift function class core-location


【解决方案1】:

其实给出位置的方法是异步的,你可以试试

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

【讨论】:

    【解决方案2】:

    从您的问题来看,您似乎习惯于程序化编程。例如,在 C 命令行实用程序中,您有一个在启动时调用的 main() 函数。 Main 调用其他函数进行设置,然后可能有一个循环来逐步完成它必须完成的工作,然后循环,等待用户输入,或者如果它是“一次性”实用程序则返回。

    大多数(全部?)基于 GUI 的操作系统的应用程序都不是这样工作的。它们是事件驱动的,通常使用面向对象的设计。您应该阅读事件驱动开发。在你研究它之前,你会很困惑,无法摆脱困境。

    这是对概念的简短介绍,但这是一个比我们在简单的帖子中所能涵盖的更深层次的主题:

    在面向对象、事件驱动的程序中,您创建的对象具有响应发生的事情的方法(函数)。你的程序定义了一组起始对象,然后这些对象等待事情发生。

    viewDidLoad() 方法是在发生某些事情时调用的方法示例。它在视图控制器(管理视图的对象)视图被创建时被调用。它使您有机会进行一次性设置,为用户“做事”做好准备。您的 viewDidLoad() 函数执行该一次性设置,然后返回。

    控制权随后返回系统,您的应用只是等待再次调用。

    您还可以添加响应用户点击按钮、滑动、有关更新 GPS 位置的通知等的方法。

    位置管理器 (CLLocationManager) 是您在想要获取有关设备位置的信息时创建的对象。您创建一个,并要求它通知您有关各种类型的位置事件。您将对象设置为位置管理器的“代表”。这就像给位置经理一个电话号码并说“当用户的位置发生变化时拨打这个号码。”

    当你告诉它你关心的事件发生时,位置管理器会调用它的代理。

    【讨论】:

    • 你是一位真正的好老师。我从你身上学到了很多。位置管理器的代表是 func locationManager ?一定要同名吗?
    • 不,委托是一个对象,它会收到有关发生的事情的通知。 (电话号码。)函数是发送给代理的消息。 “订单 12 已准备好取货。”协议是对象理解的消息的定义。 (如果对象“符合该协议”,则该对象必须提供的功能和属性的约定。)通常,委托可以是符合特定协议的任何对象。
    • 如果您在 Xcode 文档中搜索 CLLocationManager,然后单击它的 delegate 属性,您应该会看到委托必须符合 CLLocationManagerDelegate 协议。如果您对此进行搜索,您将看到您需要做的事情才能成为位置经理的代表。
    • 好吧,但我不明白 CLLocationManager 和 CLLocationManagerDelegate 之间的区别。这是正确的吗:CLLocationManager 是我们的类,在 CLLocationManager 类中包含的协议 CLLocationManagerDelegate 中,我们存储了我们所有的方法,如 func locationManager(..)?而且我们必须在代码中声明我们使用的方法。但是我们的 func locationManager 究竟是在哪里被调用的呢?
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多