UIAlertController не исключается в некоторых случаях - PullRequest
0 голосов
/ 31 января 2019

В моем проекте видео будет обработано, а затем, после некоторых эффектов, оно будет воспроизведено.Во время обработки видео я хочу показать Please wait... сообщение.

Я показываю предупреждение, используя UIAlertController, и после завершения процесса я хочу скрыть предупреждение.

Если видео обработано правильнопредупреждение будет dismissed, но в некоторых случаях, если процесс не удалось dismiss, также не будет работать!Обратите внимание, что функция dismiss будет вызвана, но она не работает.

Также для воспроизведения видео я использую VGPlayer.

class VGViewController: UIViewController {
    var player : VGPlayer?
    var url: URL?
    var outputVideo: URL?
    override func viewDidLoad() {
        super.viewDidLoad()
        showLoading()
        DispatchQueue.global(qos: .userInitiated).async {
            do {
                guard let output = try effectVideo(fileURL: url) else {
                    DispatchQueue.main.async {
                        self.hideLoading()
                    }
                    return
                }
                outputVideo = output
            } catch let e {
                DispatchQueue.main.async {
                        self.hideLoading()
                    }
                print("video error: ",e)
            }
            self.player = VGPlayer(URL: outputVideo)
            self.player?.delegate = self
            DispatchQueue.main.async {
                self.hideLoading()
                self.view.addSubview((self.player?.displayView)!)
                self.player?.backgroundMode = .proceed
                self.player?.play()
                self.player?.displayView.delegate = self
                self.player?.displayView.titleLabel.text = self.url!.lastPathComponent
                self.player?.displayView.snp.makeConstraints { [weak self] (make) in
                    guard let strongSelf = self else { return }
                    make.edges.equalTo(strongSelf.view)
                }
            }
        }
    }
    var alert: UIAlertController!
    private func showLoading() {
        alert = UIAlertController(title: nil, message: "Please wait.\nThis may take a few seconds...", preferredStyle: .alert)
        let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
        loadingIndicator.translatesAutoresizingMaskIntoConstraints = false
        loadingIndicator.hidesWhenStopped = true
        loadingIndicator.style = UIActivityIndicatorView.Style.gray
        loadingIndicator.startAnimating()
        alert.view.addSubview(loadingIndicator)
        present(alert, animated: true, completion: nil)
    }

    private func hideLoading() {
        alert.dismiss(animated: true, completion: {print("**** alert dismiss called ****")})
    }
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Есть ли у вас ошибка: «Предупреждение. Попытка представить« UIAlertController: 0x7fde1b080600 »на <...>, чье представление не находится в иерархии окон!»?

В viewDidLoad ваше приложение не представило ViewController.

Попробуйте выполнить этот код в viewDidAppear

0 голосов
/ 06 февраля 2019

Попробуйте добавить это для сокрытия alertview.

private func hideLoading() {
      for subview in alert.view.subviews {
          subview.removeFromSuperview()
      } 
        alert.dismiss(animated: true, completion: {print("**** alert dismiss called ****")})
}

Надеюсь, это сработает.

...