11 Stimmen

Wie verwendet man UIProgressView beim Laden einer UIWebView?

Ich entwickle eine Anwendung, wo ich eine Urlrequest in der UIWebView laden und es erfolgreich passiert.

Aber jetzt versuche ich, eine UIProgressView anzuzeigen, wenn das Laden im Gange ist (beginnend von 0,0 bis 1,0), die dynamisch mit dem Fortschritt des Ladens geändert wird.

Wie kann ich das tun?

22voto

Kevin Hoffman Punkte 5144

UIWebView gibt Ihnen im normalen Modus keine Fortschrittsinformationen. Sie müssen Ihre Daten zunächst asynchron über eine NSURLConnection abrufen. Wenn die NSURLConnection Delegate-Methode connection:didReceiveResponse nehmen Sie die Nummer, die Sie von expectedContentLength und verwenden Sie diesen Wert als Ihren Höchstwert. Dann, innerhalb der Delegatenmethode connection:didReceiveData verwenden Sie die Option length Eigenschaft der NSData-Instanz, um Ihnen mitzuteilen, wie weit Sie fortgeschritten sind, so dass Ihr Fortschrittsanteil length / maxLength auf einen Wert zwischen 0,0 und 1,0 normiert.

Schließlich werden Sie die Webansicht mit Daten anstelle einer URL initiieren (in Ihrem connection:didFinishLoading Delegate-Methode).

Zwei Vorbehalte:

  1. Es ist möglich, dass die expectedContentLength Eigenschaft der NSURLResponse wird sein -1 ( NSURLReponseUnknownLength konstant). In diesem Fall würde ich vorschlagen, werfen einen Standard UIActivityIndicator, die Sie in abschalten connection:didFinishLoading .

  2. Stellen Sie sicher, dass Sie jedes Mal, wenn Sie ein sichtbares Steuerelement von einer der NSURLConnection-Delegate-Methoden manipulieren, dies durch den Aufruf performSelectorOnMainThread: - Andernfalls werden Sie die gefürchteten EXC_BAD_ACCESS-Fehler erhalten.

Mit dieser Technik können Sie einen Fortschrittsbalken anzeigen, wenn Sie wissen, wie viele Daten Sie erhalten sollen, und einen Spinner, wenn Sie es nicht wissen.

1 Stimmen

Das Problem bei der Implementierung des NSURLConnection-Datenabrufs zusätzlich zur UIWebView-Ladeanforderung besteht darin, dass Sie dieselben Daten zweimal abrufen, was bei einer leichtgewichtigen Verbindung verschwenderisch ist. Sie können die NSData Instanz direkt in die UIWebView laden mit loadData:MIMEType:textEncodingName:baseURL: Dies kann jedoch andere Aspekte der Verwendung von UIWebView beeinträchtigen.

2voto

joshis Punkte 347

Sie können versuchen, diese Unterklasse von UIWebView zu verwenden, die die privaten UIWebView-Methoden verwendet - daher ist diese Lösung nicht 100 % AppStore-sicher (obwohl einige Apps sie fast 100 % verwenden: Facebook, Google-App, ...).

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

-2voto

Cristiana Chavez Punkte 11171

Wenn Sie NSURLConnection verwenden, rufen Sie dieselben Daten zweimal ab, was Zeitverschwendung ist, weil es die Benutzerinteraktion verlangsamen kann, da die Daten zweimal geladen werden und Internetdaten verbraucht werden. uiprogress basiert auf einem Timer und wenn der Webview die Webseite erfolgreich geladen hat, wird er den uiprogress loading anzeigen .in diesem Fall können Sie eine dynamische uiprogress jedes Mal die Webseite geladen wird zeigen.. dont vergessen, eine uiprogress Ansicht zu erstellen und nannte es myProgressview und setzen Sie es in Dateieigentümer ist.

HIER IST DER CODE HOFFENTLICH HILFT ES

@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

dieser Code und diese Idee helfen mir wirklich, mein Problem zu lösen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X