Представить UIAlertView в окне - PullRequest
0 голосов
/ 31 января 2020

Есть вероятность, что есть мой пользовательский вид на мой контроллер и на котором я должен показывать предупреждение. Поэтому я использую расширение ниже, чтобы представить контроллеры в окне, а не на любом контроллере UIViewController.

Расширение

extension UIViewController {
    func presentControllerToWindow(){
        let win = UIWindow(frame: UIScreen.main.bounds)
        let vc = UIViewController()
        vc.view.backgroundColor = .clear
        win.rootViewController = vc
        win.windowLevel = UIWindow.Level.alert + 1
        win.makeKeyAndVisible()
        vc.present(self, animated: true, completion: nil)
    }
}

Present AlertController

let alertController = UIAlertController(title: nil, message: "Select Option", preferredStyle: .alert)

alertController.presentControllerToWindow()

Проблема:

Код работает нормально до swift 4.X, но в swift 5.X контроллер предупреждений появляется и автоматически отключается другая секунда.

GIF:

  1. OpenPicker добавляет пользовательский вид в качестве подпредставления.
  2. При нажатии на кнопку добавления файла, я представляю alertcontroller.
  3. Его автоматически закрывается.

enter image description here

Редактировать:

Я добавляю свой пользовательский вид, как показано ниже.

extension UIView {

    func addToWindow()  {
        let window = UIApplication.shared.keyWindow!
        self.frame = window.bounds
        window.makeKeyAndVisible()
        window.windowLevel = window.windowLevel + 1
        window.addSubview(self)
    }
}

let customView = MyCustomView()
customView.addToWindow()

Теперь над этим MyCustomView мне нужно показать UIAlertController

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Вы должны добавить свой UIViewController вид в UIApplication keyWindow

extension UIViewController {
    func presentControllerToWindow(){
        let win = UIWindow(frame: UIScreen.main.bounds)
        let vc = UIViewController()
        vc.view.backgroundColor = .clear
        win.rootViewController = vc
        win.windowLevel = UIWindow.Level.alert + 1
        win.makeKeyAndVisible()
        UIApplication.shared.keyWindow?.addSubview(vc.view) //added
        vc.present(self, animated: true, completion: nil)
    }
}
0 голосов
/ 31 января 2020

Я лично использую следующее расширение для создания оповещения.

extension UIViewController {
  func showAlert(withTitle title: String?, message: String?) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    let action = UIAlertAction(title: "OK", style: .cancel, handler: nil)
    alert.addAction(action)
    present(alert, animated: true, completion: nil)
  }
}

Он отлично работает с iOS 13

...