Как запустить UIAlertController из метода делегата? - PullRequest
0 голосов
/ 20 января 2019

Мой код довольно прост.У меня есть 2 ViewControllers.На первом viewController с именем «FirstScreen» есть кнопка, которая через модальный переход выводит меня на второй экран, где также есть кнопка.«SecondScreen» имеет протокол с 1 методом, которому соответствует «FirstScreen».Поэтому я пытаюсь вызвать UIAlertController из этого метода, нажимая кнопку «Второй экран».В результате я получаю:

"Предупреждение: попытка представить ..... на ...., чье представление не находится в иерархии окон!

Я знаюЯ мог бы встроить навигационный контроллер в мою раскадровку, и предупреждение сработало бы, но это не для меня. Также я хочу вызвать Alert таким образом из-за необходимости знать CLAuthorizationStatus.

Так, может быть, есть какой-нибудь способ получить статус прямо из «SecondScreen»?

import UIKit
import CoreLocation

class FirstScreen: UIViewController {

    @IBAction func firstTapped(_ sender: UIButton) {
        let selectionVC = storyboard?.instantiateViewController(withIdentifier: "secondVC") as! SecondScreen
        present(selectionVC, animated: true, completion: nil)
        selectionVC.delegate = self
    }
}

extension FirstScreen: LocationPermissionDelegate {

    func checkLocationStatus() {

        let status = CLLocationManager.authorizationStatus()
        if status == CLAuthorizationStatus.notDetermined {

            let alert = UIAlertController(title: "Just a message", message: "HEYYY!", preferredStyle: .alert)
            let action = UIAlertAction(title: "Dismiss", style: .default, handler: nil)
            alert.addAction(action)
            present(alert, animated: true)
        }
    }
}

import Foundation
import UIKit

protocol LocationPermissionDelegate {
    func checkLocationStatus()
}

class SecondScreen: UIViewController {

    var delegate: LocationPermissionDelegate?

    @IBAction func secondTapped(_ sender: UIButton) {

        delegate?.checkLocationStatus()  
    }
}

1 Ответ

0 голосов
/ 20 января 2019

Firstvc в настоящее время представляет

present(selectionVC, animated: true, completion: nil)

, поэтому вы не можете представить предупреждение здесь

present(alert, animated: true)

Переместить это

func checkLocationStatus() {

    let status = CLLocationManager.authorizationStatus()
    if status == CLAuthorizationStatus.notDetermined {

        let alert = UIAlertController(title: "Just a message", message: "HEYYY!", preferredStyle: .alert)
        let action = UIAlertAction(title: "Dismiss", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true)
    }
}

на второй вк, и сделайте там презентацию

...