所有示例都要求授权并在视图控制器中开始更新位置。我想在app delegate中设置它,并在视图控制器中按下按钮时返回用户的坐标/位置。 (我希望在任何视图控制器中都可以访问用户坐标/位置)
答案 0 :(得分:2)
这里你没什么选择。
首先,我建议您实现或使用已经实现的CLLocationManager包装器,并从代码中的任何位置调用它,而不是直接在AppDelegate(example of such location manager implementation)中实现该功能。这样的位置管理器可以使用通知中心与您的程序的其余部分进行通信(每个视图控制器订阅您定义的特定通知),或者,例如,通过一系列闭包(每个视图控制器通过其自己的闭包来处理位置更新到位置管理器的实例,每当更新用户位置时,位置管理器调用阵列中的每个闭包,因此请求访问位置数据的所有视图控制器都将接收该更新。
除此之外,让我们考虑您已经通过AppDelegate中的CLLocationManager实现了对用户位置的访问。在接收有关位置的更新(您拥有实际位置数据)的委托功能中,您可以通过执行以下操作将此数据发送到应用程序中的任何视图控制器:
Swift - AppDelegate - 使用通知中心
public func locationManager(manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
let arrayOfLocation = locations as NSArray
let location = arrayOfLocation.lastObject as! CLLocation
let coordLatLon = location.coordinate
var userInfo = [String:AnyObject]()
userInfo["longitude"] = coordLatLon.longitude
userInfo["latitude"] = coordLatLon.latitude
let nc = NSNotificationCenter.defaultCenter()
nc.postNotificationName("userLocationUpdate", object: self, userInfo: userInfo)
}
Swift - ViewController - 使用通知中心(例如在viewDidAppear / viewDidLoad中定义)
let nc = NSNotificationCenter.defaultCenter()
nc.addObserver(self, selector: #selector(ViewController.locationUpdated(_:)), name: "userLocationUpdate", object: nil)
Swift - ViewController - locationUpdated选择器
func locationUpdated(notification: NSNotification) {
if let userInfo = notification.userInfo {
//access your data here
}
}