暂停 segue 直到位置访问为 granted/denied
Pausing segue until location access is granted/denied
我有一个 class 用于管理位置跟踪 (CLLocationManagerDelegate),还有一个单独的 class 用于我的 vc (UIViewController)。我正在 VC 中启动我的位置 class 的实例。当 class 启动时,会请求位置授权,一旦接受或拒绝,我想转到另一个 VC 以继续对应用程序(通知)的权限请求。
现在,请求烤面包机弹出,UI 在后台转到下一个 VC,然后再选择接受或拒绝。
关于如何从我的 VC class 访问我的位置 class 的委托 - locationManager(_:didChangeAuthorization) 函数的任何建议,或者关于如何访问的更好的想法实现这个??
我们的想法是不要让 VC class 成为 CLLocationManagerDelegate。'
我的位置Class:
class MyLocation: NSObject, CLLocationManagerDelegate {
static let sharedManager = MyLocation()
var locationManager = CLLocationManager()
var allDelegates = NSHashTable<CLLocationManagerDelegate>.weakObjects()
....
....
func performOnDelegates(_ aBlock:(CLLocationManagerDelegate) -> ()) {
let hashTable = isObservingHighPrecisionLocationUpdates ? highPrecisionDelegates : allDelegates
let locationManagerDelegates = hashTable.allObjects
for aDelegate in locationManagerDelegates {
aBlock(aDelegate)
}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
print("LOCATION SERVICES: Re-evaluating state after authorization state changed")
performOnDelegates { [=11=].locationManager?(manager, didChangeAuthorization: status) }
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
performOnDelegates { [=11=].locationManager?(manager, didUpdateLocations: locations) }
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("WARNING: Location update failed with error = \(error)")
performOnDelegates { [=11=].locationManager?(manager, didFailWithError: error) }
}
}
我的视图控制器Class:
import UIKit
class MyViewController: UIViewController, CLLocationManagerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func didTapNext(_ sender: UIButton) {
if sender.restorationIdentifier == "locationAccessButton" {
MyLocation.sharedManager.locationManager.requestWhenInUseAuthorization()
performSegue(withIdentifier: "nextPermissionSegue", sender: nil)
}
}
}
}
不要立即执行 segue。
不要伸手去拿你的 MyLocation
class 并直接向位置管理器发送消息。相反,向您的 MyLocation
class 添加一个新函数来请求授权,并让该函数接受一个完成块。让完成块采用状态参数(请求已授权、请求已拒绝等)。
调用该函数,并在完成块中执行 performSegue
。
我有一个 class 用于管理位置跟踪 (CLLocationManagerDelegate),还有一个单独的 class 用于我的 vc (UIViewController)。我正在 VC 中启动我的位置 class 的实例。当 class 启动时,会请求位置授权,一旦接受或拒绝,我想转到另一个 VC 以继续对应用程序(通知)的权限请求。
现在,请求烤面包机弹出,UI 在后台转到下一个 VC,然后再选择接受或拒绝。
关于如何从我的 VC class 访问我的位置 class 的委托 - locationManager(_:didChangeAuthorization) 函数的任何建议,或者关于如何访问的更好的想法实现这个??
我们的想法是不要让 VC class 成为 CLLocationManagerDelegate。'
我的位置Class:
class MyLocation: NSObject, CLLocationManagerDelegate {
static let sharedManager = MyLocation()
var locationManager = CLLocationManager()
var allDelegates = NSHashTable<CLLocationManagerDelegate>.weakObjects()
....
....
func performOnDelegates(_ aBlock:(CLLocationManagerDelegate) -> ()) {
let hashTable = isObservingHighPrecisionLocationUpdates ? highPrecisionDelegates : allDelegates
let locationManagerDelegates = hashTable.allObjects
for aDelegate in locationManagerDelegates {
aBlock(aDelegate)
}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
print("LOCATION SERVICES: Re-evaluating state after authorization state changed")
performOnDelegates { [=11=].locationManager?(manager, didChangeAuthorization: status) }
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
performOnDelegates { [=11=].locationManager?(manager, didUpdateLocations: locations) }
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("WARNING: Location update failed with error = \(error)")
performOnDelegates { [=11=].locationManager?(manager, didFailWithError: error) }
}
}
我的视图控制器Class:
import UIKit
class MyViewController: UIViewController, CLLocationManagerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func didTapNext(_ sender: UIButton) {
if sender.restorationIdentifier == "locationAccessButton" {
MyLocation.sharedManager.locationManager.requestWhenInUseAuthorization()
performSegue(withIdentifier: "nextPermissionSegue", sender: nil)
}
}
}
}
不要立即执行 segue。
不要伸手去拿你的 MyLocation
class 并直接向位置管理器发送消息。相反,向您的 MyLocation
class 添加一个新函数来请求授权,并让该函数接受一个完成块。让完成块采用状态参数(请求已授权、请求已拒绝等)。
调用该函数,并在完成块中执行 performSegue
。