2016-03-10 2 views
0

Quelqu'un at-il une idée de la raison pour laquelle mon indicateur d'activité ne s'arrête pas lorsque le chargement du webview est terminé? Vue Web est déléguée, UIActivityIndicatorView commencer à animer etc, est dans mon code ...?L'indicateur d'activité ne s'arrête pas lorsque le chargement de la vue Web est terminé

Voici le code correspondant:

import UIKit 

class ViewController: UIViewController, UIWebViewDelegate { 
@IBOutlet weak var webview: UIWebView! 
@IBOutlet weak var activity: UIActivityIndicatorView! 

var url = "http://apple.com" 

func loadURL() { 
    let requestURL = NSURL(string: url) 
    let request = NSURLRequest(URL: requestURL!) 
    webview.loadRequest(request) 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    loadURL() 
    // Do any additional setup after loading the view, typically from a nib. 
    webview.delegate = self; 
    } 


func webviewDidStartLoad(_ : UIWebView){ 
activity.startAnimating() 

    NSLog("The webview is starting to load") 
    } 

func webviewDidFinishLoad(_ : UIWebView){ 
    activity.stopAnimating() 
    activity.hidden=true; 
    NSLog("The webview is done loading") 
    } 

Merci!

Répondre

3

Attention aux noms de fonctions! C'est webView ..., chameau :)

+1

Dan est le gagnant! (voté.) Chaque fois que vous avez une méthode déléguée, si la signature du nom ou de la méthode est différente de la définition de la méthode déléguée, elle ne sera pas appelée. Cela mord tout le monde à un moment donné. Définissez un point d'arrêt dans vos méthodes déléguées et assurez-vous qu'elles sont appelées (ou utilisez une instruction log comme vous le faites). Si la méthode n'est pas appelée, copiez/collez la définition de méthode hors des docs ou des fichiers d'en-tête. –

0

Est-ce que vous obtenez "Le webview est fait charger" ?. Si ce n'est pas le cas, la demande prendra probablement beaucoup de temps pour la terminer. Toutefois, vous devez implémenter func webView(webView: UIWebView, didFailLoadWithError error: NSError?) pour détecter toute erreur et arrêter l'activité.

0

En fait, la réponse correcte est probablement une combinaison de DAN et iGongora, plus une troisième raison possible.

Le problème immédiat est que même dans un scénario chemin heureux (où le WebView se termine avec succès) est qu'il doit être le suivant (attention au cas des noms de fonction Web V iewDidStartLoad et web V iewDidFinishLoad

func webViewDidStartLoad(webView: UIWebView) { 
    activity.startAnimating() 
    NSLog("The webview is starting to load") 
} 

func webViewDidFinishLoad(webView: UIWebView) { 
    activity.stopAnimating() 
    activity.hidden=true; 
    NSLog("The webview is done loading") 
} 

De plus, si le UIWebView échoue, vous devez également arrêter la fileuse.

func webView(webView: UIWebView!, didFailLoadWithError error: NSError!) { 
    activity.stopAnimating() 
    activity.hidden=true; 
    print("Webview fail with error \(error)"); 
} 

Un autre problème possible serait que vous n'ayez pas correctement défini le délégué. Vous pouvez le faire dans le viewDidLoad ou dans Interface Builder.

override func viewDidLoad() { 
    super.viewDidLoad() 
    ... 
    self.webView.delegate = self; 
    ... 
} 
0

Exécuter ce dans la file principale si cela stoppera autre sage de ne pas le code pour cette rapide 4 et rapide 3 est

Dispatchqueue.main.async{ 
     activity.stopAnimating() 
}