Приложение аварийно завершает работу при попытке отобразить UIAlertController с сообщением: Завершение приложения из-за необработанного исключения «NSInvalidArgumentException» - PullRequest
0 голосов
/ 27 сентября 2018

Этот контроллер предупреждений инициализирован:

let alertVC2 = PMAlertController(title: "Need to always enable location authorization", description: "Go to Settings -> App -> Location. Then select 'Always'.", image: UIImage(named: "Location"), style: .alert)

Внутри ViewDidLoad() действие добавляется к alertVC2.

alertVC2.addAction(PMAlertAction(title: "OK", style: .default, action: { () in

            print("Capture action OK")
            self.alertVC2.dismiss(animated: true, completion: nil)
        }))

 alertVC2.addTextField { (textField) in
            textField?.placeholder = "Location..."
        }

Кроме того, внутри viewDidLoad() он добавлен с этим фрагментом кода, который позволит мне запускать функцию willResignActive, когда приложение снова станет активным, оставаясь в бездействующем фоне:

 NotificationCenter.default.addObserver(self, selector: #selector(willResignActive), name: UIApplication.didBecomeActiveNotification, object: nil)

Эта функция запускается, когда приложение снова становится активным:

@objc func willResignActive(_ notification: Notification) {
        print("activated")

      check()
    }

Внутри функции check() будет вызван alertVC2 (AlertController) и контроллер оповещений.будет показано на экране.Когда я возвращаю приложение к жизни, возвращая его к действию, отображается alertcontroller.Когда я выйду из приложения во второй раз и вернусь снова, оно не будет отображать alertVC2.Когда я делаю это в третий раз, приложение вылетает.

Вот краткий обзор функции check():

func check() {

    if CLLocationManager.authorizationStatus() == .notDetermined || CLLocationManager.authorizationStatus() == .authorizedWhenInUse || CLLocationManager.authorizationStatus() == .denied || CLLocationManager.authorizationStatus() == .restricted {

    locationManager.requestWhenInUseAuthorization()
        locationManager.requestAlwaysAuthorization()

        if CLLocationManager.authorizationStatus() != .authorizedAlways {

        print("Need to always authorize location for me")

        self.present(alertVC2, animated: true, completion: nil)

        }
    }

    if CLLocationManager.authorizationStatus() == .authorizedAlways {

        locationManager.startUpdatingLocation()

    }


}

Это сообщение об ошибке, которое я получаю, когда приложение падает в третьемпопытка:

Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Приложение попыталось представить модально активный контроллер

Что мне нужно сделать, чтобы он не использовалсявылетает и продолжает публиковать alertcontroller?

1 Ответ

0 голосов
/ 27 сентября 2018

Похоже, вы пытаетесь представить контроллер предупреждений несколько раз.Если вы ставите точку останова в строке, где вы вызываете self.present, сколько раз она попадает в нее?

Самый простой способ, если я предполагаю, что это правильно, - это проверить, является ли представлениев настоящее время представляет что-либо, и если это так, пропустите представление оповещения.Может быть что-то вроде:

if CLLocationManager.authorizationStatus() != .authorizedAlways {
    print("Need to always authorize location for me")
    if self.presentedViewController == nil {
        self.present(alertVC2, animated: true, completion: nil)
    }

}

Или, может быть, что-то вроде:

if CLLocationManager.authorizationStatus() != .authorizedAlways {
    print("Need to always authorize location for me")
    if !alertVC2.isBeingPresented { // make sure we're not already presenting this alert to the user
        self.present(alertVC2, animated: true, completion: nil)
    }

}
...