/ / Kann ich in Swift feststellen, ob eine CLLocation gültig ist oder nicht? - iOS, Swift, Mapkit, Core-Location

Kann ich in Swift feststellen, ob ein CLLocation gültig ist oder nicht? - ios, swift, mapkit, kernstandort

Ich übergebe einen Ort an einen anderen UIViewController was hat a MapView verwenden prepareForSegue. Ich nenne das receivedLocation. Die Karte zentriert sich auf den übergebenen Ort. Wenn der Benutzer auf eine Schaltfläche klickt, um sie zur Karte zu bringen, ohne zuerst einen Standort zu senden, schlägt dies dann fehl?

Wie kann ich testen, ob receivedLocation enthält tatsächlich Daten, so dass ich die Karte auf etwas anderes zentrieren kann, wenn es leer ist?

Würde eine boolesche Variable erstellen und anfänglich auf "false" setzen, diese aber auf "true" setzen, wenn ein Ort übergeben und getestet wird Das arbeiten wie ich es wünsche?

Ich sehe etwas namens CLLocationCoordinateIsValid ist verfügbar, aber sein Parameter ist ein 2DCoordinate, wo ich auf das gleiche Problem stoße, zu testen, ob oder nicht receivedLocation.

Ich bin ziemlich neu in diesem Bereich und habe bereits versucht, eine Antwort zu finden, konnte aber keine passende finden. Vielen Dank!

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)

}

Bisher funktioniert das bei mir nicht. CLLocationCoordinate2DIsValid gibt immer true zurück, zentriert sich um eine Insel und fügt diesem seltsamen Punkt eine Anmerkung hinzu.

Antworten:

5 für die Antwort № 1

Erstens, setzen Sie nicht unnötigerweise ein nutzloses CLLocation() in receivedLocation. Erklären receivedLocation als implizit ausgepackt Wahlweise:

 var receivedLocation : CLLocation! = nil

Auf diese Weise hat es entweder jemand eingestellt oder er hat es nicht eingestellt. Wenn dies nicht der Fall ist, ist es null, und Sie können Folgendes testen:

if receivedLocation != nil {
// okay, it"s a real location!
}

Zweitens, dein else wird niemals funktionieren, da es einige Zeit dauert, bis sich die Sensoren aufgewärmt haben und einen Standort gefunden haben. Tatsächlich werden sie möglicherweise nie einen bekommen. So kann ich das in dem Fall ziemlich gut garantieren, in dem receivedLocation ist Null, currentManager.location wird auch keine Verwendung sein. (Sehen meine Antwort hier Hier finden Sie eine Erklärung und einen Zeiger auf Beispielcode, wie Sie mit einem Standortmanager einen einzelnen Standortwert abrufen.)