UIWebView non fornisce informazioni sull'avanzamento nella modalità normale. Quello che devi fare è recuperare i dati in modo asincrono usando NSURLConnection. Quando si utilizza il metodo delegato NSURLConnection connection:didReceiveResponse
, si prende il numero ottenuto da expectedContentLength
e lo si utilizza come valore massimo. Quindi, all'interno del metodo delegato connection:didReceiveData
, utilizzerai la proprietà length
dell'istanza NSData per dirti quanto sei distante, quindi la tua frazione di progresso sarà length/maxLength
, normalizzata tra 0,0 e 1,0.
Infine, si avvia la visualizzazione Web con i dati anziché un URL (nel metodo connection:didFinishLoading
delegato).
due accorgimenti:
È possibile che la proprietà del NSURLResponse expectedContentLength
sarà -1 (NSURLReponseUnknownLength
costante). In tal caso, suggerirei di lanciare un UIActivityIndicator standard da chiudere all'interno di connection:didFinishLoading
.
Assicurarsi che ogni volta che si manipola un controllo visibile da uno dei metodi delegati NSURLConnection, lo si faccia chiamando performSelectorOnMainThread:
- altrimenti inizierai a ricevere gli errori EXC_BAD_ACCESS temuti.
Utilizzando questa tecnica, è possibile visualizzare una barra di avanzamento quando si conosce la quantità di dati che si desidera ottenere e una centrifuga quando non si conosce.
fonte
2009-12-15 13:39:36
Il problema con l'implementazione del recupero dati NSURLConnection sulla richiesta di caricamento di UIWebView è che si stanno acquisendo gli stessi dati due volte, il che è uno spreco su una connessione leggera. È possibile caricare l'istanza NSData direttamente in UIWebView con 'loadData: MIMEType: textEncodingName: baseURL:', ma questo può compromettere altri aspetti dell'utilizzo di UIWebView. –