UIWebView doesn't give you any progress information in the normal mode. What you need to do is first fetch your data asynchronously using an NSURLConnection.
When the NSURLConnection delegate method connection:didReceiveResponse
, you're going to take the number you get from expectedContentLength
and use that as your max value. Then, inside the delegate method connection:didReceiveData
, you're going to use the length
property of the NSData instance to tell you how far along you are, so your progress fraction will be length / maxLength
, normalized to between 0.0 and 1.0.
Finally, you're going to init the webview with data instead of a URL (in your connection:didFinishLoading
delegate method).
Two caveats:
It is possible that the expectedContentLength
property of the NSURLResponse is going to be -1 (NSURLReponseUnknownLength
constant). In that case, I would suggest throwing up a standard UIActivityIndicator that you shut off inside connection:didFinishLoading
.
Make sure that any time you manipulate a visible control from one of the NSURLConnection delegate methods, you do so by calling performSelectorOnMainThread:
- otherwise you'll start getting the dreaded EXC_BAD_ACCESS errors.
Using this technique, you can show a progress bar when you know how much data you're supposed to get, and a spinner when you don't know.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…