2

我的场景,我试图在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)
                }
        }

其他视图控制器

    func dataJson() {

 // Start Loading
    self.loadinHubShow()

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

我的警告

警告:在演示或关闭过程中尝试从视图控制器中关闭!

4

2 回答 2

1

如我所见,您将此功能用作UIViewController扩展。

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

注意:如果您dismiss像以前一样使用函数,那么您正在尝试关闭 viewController,而不是警报,这就是您收到该警告的原因。

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

1)loadinHubShow将 a 返回referencealert

      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)
   }
于 2019-05-23T13:48:00.487 回答
0

问题与您执行同步 json 解析过程有关,这会导致

  func dataJson() { 
      self.loadinHubShow()

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

在它完成显示之前关闭警报因此警告,所以要么完全删除警报等待或使用 dispatchAfter

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
   self.loadinHubDismiss()
}
于 2019-05-23T14:25:20.617 回答