2017-04-16 26 views
2

我有一個使用整個各種視圖conrollers用戶的位置的應用程序,我已經瞭解到,爲了得到那個位置,你需要創建一個CLLocationManger實例,並符合CLLocationManagerDelegate協議。我應該在哪裏實例化一個位置管理器,如果我的應用程序使用它在它的各種視圖控制器?

是否有可能使一個CLLocationManager實例,並使用它就像座標性質在我不同的視圖控制器或我應該在每個視圖控制器類CLLocationManager?

+0

是否有可能處於一種剛剛創建常量文件? –

+0

你已經試過了什麼?是的,可以並鼓勵使用CLLocationManager的單個實例。委託可以是一個共享對象通過該其他客戶機可在它的屬性做KVO或它可以發送NSNotifications(不太理想的) – dbn

+0

@dbn我考慮在應用程序委託的didloadwithoptions功能實例化它並試圖參考從其它視圖控制器的實例,但它沒有工作。所以我來這裏尋找答案。我只需要在其他視圖控制器中使用緯度和經度。 –

回答

1

快速,有點強大的黑客可能是:

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate { 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     locationManager = CLLocationManager() 
     locationManager.delegate = self 
     locationManager.startUpdatingLocation() 
     return true 
    } 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     lastLocation = locations.last! 
    } 

在這同一個源文件,在全局範圍內,添加:

private var lastLocation: CLLocation? { 
    didSet { 
     locationCallback?(lastLocation!) 
     locationCallback = nil 
    } 
} 

private var locationCallback: ((CLLocation) -> Void)? 

func getLastLocation(callback: (CLLocationManager) -> Void) { 
    guard let location = lastLocation else { 
     locationCallback = callback 
     return 
    } 
    locationCallback(location) 
} 

最後,在你的應用程序的其他地方,你可以得到你最後只使用已知的位置:

getLastLocation { location in 
    print(location) 
} 
+0

非常感謝!那會比創建一個單例/靜態類並在那裏做同樣的事情更好嗎? –

+0

@PaulJohn我會說是的,和單身人士一樣!但是,如果你的應用程序變得龐大,具有各種基於位置的功能,那麼將此代碼重構爲專用類是前進的方向;-) –

相關問題