使用Activity Loader的Alert ViewController发出警告,而不是关闭Swift

时间:2019-05-23 13:18:45

标签: ios swift uialertviewcontroller

我的情况是,我正在尝试在AlertViewController中创建Loader。在这里,我受到警告的警告,并且不允许在两次审判后被解雇。我在一个通用类中使用下面的函数,并在多个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 :(得分:0)

如我所见,您正在使用此功能作为UIViewController扩展名。

获得结果的一种方法是获取对您正在使用的警报的引用。

  

注意: :如果您像以前一样使用dismiss函数,那么您将尝试关闭viewController而不是警报,这就是为什么得到警告。

尝试以这种方式更改扩展功能:

1)loadinHubShowreference返回到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)
               }



            }

EDIT

按照建议关闭alert,请尝试:

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

答案 1 :(得分:0)

该问题与您执行导致

的同步json解析过程有关
  func dataJson() { 
      self.loadinHubShow()

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

在完成警告之前要消除的警报因此显示警告,因此请完全删除等待的警报或使用dispatchAfter

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
   self.loadinHubDismiss()
}