我的情况是,我正在尝试在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()
}
}
我的警告
警告:尝试从视图控制器中关闭 演讲或解雇时 正在进行中!
答案 0 :(得分:0)
如我所见,您正在使用此功能作为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)
}
}
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()
}