暂停 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