在Swift中,我能否检测一个CLLocation是否有效?

5

我正在使用prepareForSegue方法将位置信息传递给另一个带有MapViewUIViewController,并将其称为receivedLocation。地图以传递的位置为中心显示。如果用户在先前未发送位置信息的情况下单击按钮以使其转到地图页面,会出现什么问题?

如何测试receivedLocation是否包含数据,以便在其为空时将地图设置为中心点的其他位置?

创建一个布尔变量,最初将其设置为false,但在传递位置并测试该变量后将其设置为true,这样是否可以达到预期效果?

我发现CLLocationCoordinateIsValid可用,但其参数是2D坐标,在测试receivedLocation是否存在时会遇到同样的问题。

我刚接触这个领域,并尝试寻找答案,但没有找到合适的答案。谢谢!

import UIKit
import MapKit
import CoreLocation

class mapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    @IBOutlet var map: MKMapView!
    @IBOutlet var notes: UITextView!

    var receivedLocation = CLLocation()
    var annotation = MKPointAnnotation()
    var currentManager:CLLocationManager!

    var latitute:CLLocationDegrees = CLLocationDegrees()
    var longitude:CLLocationDegrees = CLLocationDegrees()

    override func viewDidLoad() {
        super.viewDidLoad()

        map.layer.cornerRadius = 12.0
        notes.layer.cornerRadius = 12.0

        currentManager = CLLocationManager()
        currentManager.delegate = self
        currentManager.desiredAccuracy = kCLLocationAccuracyBest
        currentManager.startUpdatingLocation()

        if CLLocationCoordinate2DIsValid(receivedLocation.coordinate) {

            latitute = receivedLocation.coordinate.latitude
            longitude = receivedLocation.coordinate.longitude
            annotation.coordinate.latitude = receivedLocation.coordinate.latitude
            annotation.coordinate.longitude = receivedLocation.coordinate.longitude
            map.addAnnotation(annotation)

        } else {

            latitute = currentManager.location.coordinate.latitude
            longitude = currentManager.location.coordinate.longitude
        }

        var latDelta: CLLocationDegrees = 0.01
        var lonDelta: CLLocationDegrees = 0.01
        var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)
        var location : CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitute, longitude)
        var region: MKCoordinateRegion = MKCoordinateRegionMake(location, span)       
        map.setRegion(region, animated: false)

    }

目前这对我不起作用。CLLocationCoordinate2DIsValid总是返回true,并围绕一个岛屿居中,以及在那个奇怪的地方添加注释。


@CodyLucas 如果你只想检查有效位置,那么你可以像你在问题中提到的那样使用'CLLocationCoordinateIsValid'函数。这里是Swift的示例代码:`var location = CLLocation()var isValid = CLLocationCoordinate2DIsValid(location.coordinate)`为了更深入地了解问题,需要在此处提供您的源代码。 - Vijay Masiwal
我不明白。在那段代码中,你所提到的 receivedLocation 是什么?请展示它的声明。 - matt
@matt 不好意思,不知道为什么我停在了viewDidLoad()... 给你。 - Cody Lucas
好的,现在正在回答中。 - matt
1个回答

7

首先,不要无谓地在 receivedLocation 中加入一个无用的 CLLocation()。将 receivedLocation 声明为隐式展开的 可选项

 var receivedLocation : CLLocation! = nil

那么,要么有人设置了它,要么没有设置。如果他们没有设置,它就为nil,您可以进行测试:
if receivedLocation != nil {
    // okay, it's a real location!
}

其次,你的 else 永远不会起作用,因为传感器需要时间预热并获取位置,事实上,它们可能永远无法获得位置。所以我可以非常确信,在 receivedLocation 是 nil 的情况下,currentManager.location 也没有任何用处。(请参见我的答案,其中有解释和指向示例代码的指针,说明如何使用位置管理器获取单个位置值。)


太好了,你做到了。至于else部分,receivedLocation只有在按下按钮后才有值。如果他们在没有按下按钮的情况下进入地图,则应该处理此问题。现在我唯一的问题是,如果我添加一个注释然后离开MapView并回来,注释就会消失。你不必回答,因为这是一个单独的问题,但如果你有时间,你认为什么可以解决这个问题? - Cody Lucas
不,你是对的,这是一个单独的问题。请随意提出您的其他问题作为单独的问题!更多问题是好的。正如您将发现的那样,Stack Overflow非常适合单个问题 - 我们刚刚使用的问题/评论/编辑/答案循环工作得非常完美(正如您所看到的!)。如果您在评论中再提出进一步的问题,情况就会失控。 - matt
谢谢你的帮助,马特!祝你晚上愉快。 - Cody Lucas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接