2015-05-11 78 views
3

我將一個位置傳遞給另一個UIViewController,該位置的MapView使用的是prepareForSegue。我稱之爲receivedLocation。地圖以傳遞的位置爲中心。如果用戶點擊一個按鈕將它們帶到地圖上而不先發送位置,這是否會失敗?在Swift中,我可以檢測一個CLLocation是否有效嗎?

如何測試以確定receivedLocation是否實際上包含數據,以便我可以將地圖設置爲以其他方式爲中心,如果它爲空?

會創建一個布爾變量,並最初將其設置爲false,但通過一個位置並測試時,它將其變爲true我的願望?

我看到一個名爲CLLocationCoordinateIsValid的東西可用,但它的參數是2DCoordinate,在這裏我碰到了測試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並以一個島爲中心,並向該怪異點添加註釋。

+0

顯示。你的。碼。 – matt

+0

@CodyLucas如果你只想檢查有效的位置,你可以使用'CLLocationCoordinateIsValid'函數,就像你在你的問題中提到的那樣。這裏是迅速 '變種位置= CLLocation示例代碼() VAR的isValid = CLLocationCoordinate2DIsValid(location.coordinate)' 瞭解的問題更深入地需要你的源代碼在這裏。 –

+0

@matt你在這裏 –

回答

5

首先,不要不必要地將一個無用的CLLocation()納入receivedLocation。聲明receivedLocation一個隱含展開可選

var receivedLocation : CLLocation! = nil 

這樣一來,無論是有人將它設置或者他們沒有。如果他們沒有,它是零,你可以測試:

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

其次,你的else是永遠不會工作,因爲它需要時間的傳感器來熱身,並得到一個位置 - 事實上,他們可能永遠得不到一個。所以我可以很好地保證在receivedLocation無的情況下,currentManager.location也不會有任何用處。 (有關如何使用位置管理器獲取單個位置值的說明和示例代碼指針,請參見my answer here。)

+0

非常好,你有工作。至於else,一旦按下按鈕,receivedLocation就只有一個值。如果他們沒有按下地圖前往地圖,這是爲了解決這個問題。現在我唯一的問題是,如果我添加一個註釋,然後離開MapView並回來,註釋消失了。你不必回答,因爲這是一個單獨的問題,但如果你有時間,有什麼可以解決的? –

+0

不,你是對的,這是一個單獨的問題。請隨時將您的其他問題作爲一個單獨的問題!更多的問題是好的。 (很好。)正如你將會發現的,Stack Overflow針對單一問題的問題設計得非常好 - 我們剛剛使用的問題/評論/編輯/回答循環完美無缺(如你所見!)。如果您在評論中提出進一步的問題,事情就會失控。 – matt

+0

謝謝你的幫助,馬特!有一個美妙的夜晚。 –

相關問題