从浏览器加载回iOS应用程序时,进度指示器无法停止动画

时间:2016-09-12 09:57:16

标签: ios swift uiactivityindicatorview

在我的应用程序中,我有一个打开浏览器(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()
}  

3 个答案:

答案 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 = UIActivityIndi​​catorView()让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)

看起来您引用了错误的progressIndicatorstopAnimating()

在上面你有一个:

let progressIndicator = UIActivityIndicatorView()

这将创建一个新的UIActivityIndi​​catorView()并开始为其设置动画。

但在webViewDidFinishLoad中,您无法从上方获取progressIndicator实例。我怀疑您引用了IBOutlet或类variable。因此,您告诉错误的UIActivityIndicatorView()停止。

如果它是一个类变量,在上面的代码中,你应该用它替换它:

let progressIndicator = UIActivityIndicatorView()  
progressIndicator = UIActivityIndicatorView()       //replace above with this

如果是IBOutlet链接到情节提要中的UIActivityIndicatorView(),您应该只是致电progressIndicator.startAnimating() 没有创建一个新的。因此,只需删除let progressIndicator = UIActivityIndicatorView()

即可

答案 2 :(得分:-1)

可能需要删除UIActivityIndi​​catorView

progressIndicator.removeFromSuperview()