2016-12-18 8 views
0

У меня есть класс для управления отслеживанием местоположения (CLLocationManagerDelegate) и отдельный класс для моего vc (UIViewController). Я инициирую экземпляр моего класса местоположения в VC. Когда класс инициируется, запрашивается авторизация местоположения, и после того, как это принято или отклонено, я хочу перейти в другой VC, чтобы продолжить запросы на разрешение для приложения (уведомлений).Приостановка segue до тех пор, пока не будет предоставлен доступ/разрешен доступ

Прямо сейчас появляется тостер-запросчик, а пользовательский интерфейс переходит к следующему VC в фоновом режиме, прежде чем принимать или отклонять.

Любые предложения по доступу к делегату класса моего местоположения - locationManager (_: didChangeAuthorization) func из моего класса VC или лучшая идея о том, как это сделать?

Идея заключается не в том, чтобы класс VC стал CLLocationManagerDelegate. '

Мое расположение Класс:

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 { $0.locationManager?(manager, didChangeAuthorization: status) } 
    } 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     performOnDelegates { $0.locationManager?(manager, didUpdateLocations: locations) } 
    } 

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 

     print("WARNING: Location update failed with error = \(error)") 
     performOnDelegates { $0.locationManager?(manager, didFailWithError: error) } 
    } 
} 

Мой View Controller Класс:

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) 
     } 
    } 
} 

}

ответ

0

Не выполняйте SEGUE сразу.

Не заходите в свой класс MyLocation и отправляйте сообщения менеджеру местоположения напрямую. Вместо этого добавьте новую функцию в свой класс MyLocation, чтобы запросить авторизацию, и чтобы эта функция выполняла блок завершения. У блока завершения введите параметр статуса (авторизация запроса, отказ в запросе и т. Д.).

Вызовите эту функцию и выполните команду performSegue в блоке завершения.

 Смежные вопросы

  • Нет связанных вопросов^_^