В моем приложении для iOS я запрашиваю у пользователя разрешение на определение местоположения устройства.На моем главном ViewController у меня есть кнопка панели навигации, при нажатии которой у пользователя запрашивается разрешение на использование.Если пользователь нажмет OK, он будет отправлен на контроллер представления, который отображает локальные данные.Если пользователь нажимает Отмена, то ничего не происходит.У меня также есть всплывающее окно, когда и если пользователь снова нажимает на кнопку местоположения, чтобы перенаправить на настройки, чтобы разрешить использование местоположения, если оно было ранее отменено.
Приложение работает так, как я планировал в симуляторе, но при использованиина устройстве, когда пользователь нажимает кнопку «ОК», чтобы разрешить использование местоположения, он переходит к локальному контроллеру представления, но делает это 2 или 3 раза подряд.
Переход переходит от контроллера основного представления к контроллеру локального просмотра.и он запрашивает разрешения от нажатия кнопки, используя IBAction.
Информация о местоположении получается в контроллере основного вида и передается в локальный контроллер.Локальный контроллер отображает все как положено.
Как я могу предотвратить этот двойной или тройной переход к одному и тому же View Controller?
Ниже мой код:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toLocal" {
let destination = segue.destination as! LocalViewController
destination.latitude = latitude
destination.longitude = longitude
}
}
//MARK: - Location Manager Methods
@IBAction func LocationNavBarItemWasTapped(sender: AnyObject) {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location = locations[locations.count - 1]
if location.horizontalAccuracy > 0 {
locationManager.stopUpdatingLocation()
latitude = location.coordinate.latitude
longitude = location.coordinate.longitude
}
let status = CLLocationManager.authorizationStatus()
switch status {
case .restricted, .denied:
showLocationDisabledPopUp()
return
case .notDetermined:
// Request Access
locationManager.requestWhenInUseAuthorization()
case .authorizedAlways:
print("Do Nothing: authorizedAlways")
case .authorizedWhenInUse:
self.performSegue(withIdentifier: "toLocal", sender: nil)
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("LocationManager failed with error \(error)")
}
private func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if (status == CLAuthorizationStatus.denied) {
showLocationDisabledPopUp()
}
}