Question Comment utiliser UIProgressView lors du chargement d'un UIWebView?


Je développe une application où je charge une urlrequest dans UIWebView et cela s'est passé avec succès.

Mais maintenant, j'essaie d'afficher un UIProgressView lorsque le chargement est en cours (à partir de 0.0 à 1.0), ce qui change dynamiquement avec la progression du chargement.

Comment puis je faire ça?


11
2017-12-14 10:39


origine


Réponses:


UIWebView ne vous donne aucune information de progression en mode normal. Vous devez d'abord extraire vos données de manière asynchrone en utilisant NSURLConnection. Lorsque la méthode de délégation NSURLConnection connection:didReceiveResponse, vous allez prendre le numéro que vous obtenez de expectedContentLength et l'utiliser comme votre valeur maximale. Ensuite, dans la méthode des délégués connection:didReceiveData, vous allez utiliser le length propriété de l'instance NSData pour vous dire à quelle distance vous vous trouvez, donc votre fraction de progression sera length / maxLength , normalisé entre 0,0 et 1,0.

Enfin, vous allez lancer la vue Web avec des données au lieu d'une URL (dans votre connection:didFinishLoading méthode déléguée).

Deux mises en garde:

  1. Il est possible que le expectedContentLength la propriété de NSURLResponse va être -1 (NSURLReponseUnknownLength constant). Dans ce cas, je suggère de lancer un UIActivityIndicator standard que vous fermez à l'intérieur connection:didFinishLoading.

  2. Assurez-vous que chaque fois que vous manipulez un contrôle visible d’une des méthodes de délégué NSURLConnection, vous le faites en appelant performSelectorOnMainThread: - sinon vous commencerez à recevoir les erreurs EXC_BAD_ACCESS.

En utilisant cette technique, vous pouvez afficher une barre de progression lorsque vous savez combien de données vous êtes censé obtenir, et une flèche lorsque vous ne savez pas.


22
2017-12-15 13:39



Vous pouvez essayer d'utiliser cette sous-classe de UIWebView qui utilise les méthodes UIWebView privées - par conséquent, cette solution n'est pas sécurisée à 100% avec AppStore (bien que certaines applications l'utilisent presque à 100%: Facebook, Google app, ...).

https://github.com/petr-inmite/imtwebview


2
2017-11-23 20:17



En utilisant NSURLConnection, vous récupérez deux fois les mêmes données, car vous perdez du temps car cela peut ralentir l’interaction de l’utilisateur, il charge les données deux fois, consomme des données Internet. uiprogress basé sur le minuteur et lorsque la webview réussit à charger la page Web, elle affichera le chargement.dans ce cas, vous pouvez afficher une dynamique à chaque fois que la page Web est chargée. N'oubliez pas de créer une vue uiprogress et de la nommer myProgressview et de la définir dans le propriétaire du fichier.

VOICI LE CODE HOPE IT HELPS

@synthesize myProgressView;
- (void)updateProgress:(NSTimer *)sender
{      //if the progress view is = 100% the progress stop
    if(myProgressView.progress==1.0)
    {
        [timer invalidate]; 
    }
   else
         //if the progress view is< 100% the progress increases
       myProgressView.progress+=0.5;
}
- (void)viewDidLoad
{ //this is the code used in order to load the site
    [super viewDidLoad];
    NSString *urlAddress = @"http://www.playbuzz.org/";
    myWebview.delegate = self;
   [myWebview loadRequest:[NSURLRequest requestWithURL:[NSURL     URLWithString:urlAddress]]];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{    ///timer for the progress view

 timer=[[NSTimer scheduledTimerWithTimeInterval:0.1
                          target:self
                          selector:@selector(updateProgress:)
                          userInfo:myProgressView
                          repeats:YES]retain];

}

- (void)dealloc {
    [myProgressView release];
    [super dealloc];
}
@end

Ce code et cette idée m'aident vraiment à résoudre mon problème.


-2
2017-10-04 04:38