Alert ViewController с загрузчиком активности получает предупреждение, а не прекращает работу Swift - PullRequest
1 голос
/ 23 мая 2019

Мой сценарий, я пытаюсь создать Loader в AlertViewController. Здесь я получаю ниже предупреждения и не позволяю уволить после двух испытаний. Я использую функцию ниже в общем классе и повторное использование в нескольких viewController.

Мой код

    // MARK: Common AlertView
        extension UIViewController {

            func loadinHubShow() {

                    let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert)
                    let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
                    loadingIndicator.hidesWhenStopped = true
                    loadingIndicator.style = UIActivityIndicatorView.Style.gray
                    loadingIndicator.startAnimating();
                    alert.view.addSubview(loadingIndicator)
                    present(alert, animated: true, completion: nil)
                }

                func loadinHubDismiss() {
                    dismiss(animated: false, completion: nil)
                }
        }

Другой ViewController

    func dataJson() {

 // Start Loading
    self.loadinHubShow()

// after process done
 DispatchQueue.main.async {
         self.loadinHubDismiss()
    }
}

Мое предупреждение

Внимание! Попытка отстранения от просмотра контроллера во время презентации или увольнения в процессе!

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Проблема связана с тем, что вы выполняете синхронный процесс синтаксического анализа json, который вызывает

  func dataJson() { 
      self.loadinHubShow()

   // after process done
   DispatchQueue.main.async {
     self.loadinHubDismiss()
    }
 }

предупреждение о прекращении до того, как оно выполнено, и, следовательно, предупреждение, поэтому либо полностью удалите предупреждение в ожидании, либо используйте dispatchAfter

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
   self.loadinHubDismiss()
}
0 голосов
/ 23 мая 2019

Как я вижу, вы используете эти функции как расширение UIViewController.

Один из способов добиться вашего результата - получить ссылку на оповещение, которое вы используете.

ПРИМЕЧАНИЕ: Если вы используете функцию dismiss, как вы, вы пытаетесь закрыть viewController, а не предупреждение, поэтому вы получаете этопредупреждение.

Попробуйте изменить функцию расширения следующим образом:

1) loadinHubShow вернет reference в alert

      func loadinHubShow() -> UIAlertController {

            let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert)
            let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
            loadingIndicator.hidesWhenStopped = true
            loadingIndicator.style = UIActivityIndicatorView.Style.gray
            loadingIndicator.startAnimating();
            alert.view.addSubview(loadingIndicator)

            return alert
            //You don't have to present the alert here
            //present(alert, animated: true, completion: nil)
        }

2) loadinHubDismiss удалит это alert:

         func loadinHubDismiss(alert: UIAlertController) {
            alert.dismiss(animated: false, completion: nil)
        }

Чтобы использовать эти функции, давайте предположим, что у вас есть ViewController:

            class ViewController: UIViewController{

              var myAlert: UIAlertController = UIAlertController()

               override func viewDidLoad(...){
                  myAlert = self.loadinHubShow()
                  //now you can present or dismiss the alert wherever you want
                  //for example:
                  self.present(myAlert,animated: false, completion: nil)

                  //when you want dismiss the alert, just call:
                  self. loadinHubDismiss(alert: myAlert)
               }



            }

РЕДАКТИРОВАТЬ

, чтобы отклонить alert, как предложено, попробуйте:

   DispatchQueue.main.async{
        loadinHubDismiss(alert: myAlert)
   }
...