在我的应用程序中,我有一个打开浏览器(Safari)的链接,当从浏览器返回到应用程序时,UIActivityIndicatorView
无法停止加载或动画,虽然我已实现它以停止动画..任何帮帮我们......这是我的代码
func webViewDidStartLoad(_ : UIWebView){
let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .Alert)
alert.view.tintColor = UIColor.blackColor()
let progressIndicator = UIActivityIndicatorView()
alert.view.addSubview(progressIndicator)
let views = ["alert" : alert.view, "progressIndicator" : progressIndicator]
var constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:[progressIndicator]-(-50)-|", options: [] , metrics: nil, views: views)
constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[progressIndicator]|", options: [], metrics: nil, views: views)
alert.view.addConstraints(constraints)
progressIndicator.userInteractionEnabled = false
progressIndicator.startAnimating()
self.presentViewController(alert, animated: true, completion:nil)
}
func webViewDidFinishLoad(_ : UIWebView){
dismissViewControllerAnimated(false, completion: nil)
progressIndicator.stopAnimating()
}
答案 0 :(得分:1)
警报控制器无法解除,因为您使用动画呈现视图控制器,并且在动画完成Web视图委托方法func webViewDidFinishLoad(_:UIWebView)被调用之前。
问题有2个解决方案
1)出现没有动画的警报视图控制器
self.presentViewController(alert,animated:false,completion:nil)
2)延迟几毫秒后解除警报控制器
let delayTime = dispatch_time(DISPATCH_TIME_NOW,Int64(0.1 * Double(NSEC_PER_SEC)))dispatch_after(delayTime,dispatch_get_main_queue()){self.alert.dismissViewControllerAnimated(false,completion:nil)self.progressIndicator.stopAnimating()} < / p>
代码段
让progressIndicator = UIActivityIndicatorView()让alert = UIAlertController(标题:nil,消息:&#34;请稍候......&#34;,preferredStyle:.Alert)
func webViewDidStartLoad(_ : UIWebView) {
alert.view.tintColor = UIColor.blackColor()
alert.view.addSubview(progressIndicator)
let views = ["alert" : alert.view, "progressIndicator" : progressIndicator]
var constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:[progressIndicator]-(-50)-|", options: [] , metrics: nil, views: views)
constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[progressIndicator]|", options: [], metrics: nil, views: views)
alert.view.addConstraints(constraints)
progressIndicator.userInteractionEnabled = true
progressIndicator.startAnimating()
// If false then 1 solution will work
self.presentViewController(alert, animated: false, completion:nil)
// If true then 2 solution will work
self.presentViewController(alert, animated: true, completion:nil)
}
func webViewDidFinishLoad(_ : UIWebView) {
// 1 Solution
/*self.alert.dismissViewControllerAnimated(false, completion: nil)
self.progressIndicator.stopAnimating()*/
// 2 Solution
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
self.alert.dismissViewControllerAnimated(false, completion: nil)
self.progressIndicator.stopAnimating()
}
}
答案 1 :(得分:0)
看起来您引用了错误的progressIndicator
到stopAnimating()
。
在上面你有一个:
let progressIndicator = UIActivityIndicatorView()
这将创建一个新的UIActivityIndicatorView()并开始为其设置动画。
但在webViewDidFinishLoad
中,您无法从上方获取progressIndicator
实例。我怀疑您引用了IBOutlet
或类variable
。因此,您告诉错误的UIActivityIndicatorView()
停止。
如果它是一个类变量,在上面的代码中,你应该用它替换它:
let progressIndicator = UIActivityIndicatorView()
progressIndicator = UIActivityIndicatorView() //replace above with this
如果是IBOutlet
链接到情节提要中的UIActivityIndicatorView()
,您应该只是致电progressIndicator.startAnimating()
没有创建一个新的。因此,只需删除let progressIndicator = UIActivityIndicatorView()
答案 2 :(得分:-1)
可能需要删除UIActivityIndicatorView
progressIndicator.removeFromSuperview()