如何从委托方法启动 UIAlertController?

How to initiate UIAlertController from a delegate method?

我的代码很基础。我有 2 个视图控制器。在名为 "FirstScreen" 的第一个 viewController 上有一个按钮,通过模式转场将我带到第二个屏幕,那里也有一个按钮。 "SecondScreen" 有一个带有 1 方法的协议,"FirstScreen" 符合该协议。所以基本上我试图从那个方法调用 UIAlertController,同时按下 "SecondScreen" 的按钮。结果我得到:

"Warning: Attempt to present.....on....whose view is not in the window hierarchy!

我知道我可以将导航控制器嵌入到我的情节提要中并且警报会起作用,但我不是这种情况。我也想通过这种方式调用 Alert,因为需要知道 CLAuthorizationStatus.

So maybe is there any way of getting the status directly from the "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()  
    }
}

第一个vc目前正在呈现

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

到第二个 vc ,并在那里做演示