我正在開發一個應用程序,我在UIWebView中加載urlrequest,並且它成功發生。如何在加載UIWebView時使用UIProgressView?
但現在我試圖顯示一個UIProgressView加載過程中(從0.0開始到1.0),這是隨着加載進度動態改變。
我該怎麼做?
我正在開發一個應用程序,我在UIWebView中加載urlrequest,並且它成功發生。如何在加載UIWebView時使用UIProgressView?
但現在我試圖顯示一個UIProgressView加載過程中(從0.0開始到1.0),這是隨着加載進度動態改變。
我該怎麼做?
UIWebView在正常模式下不會給你任何進度信息。你需要做的是首先使用NSURLConnection異步獲取你的數據。 當NSURLConnection委託方法connection:didReceiveResponse
,你將採取從expectedContentLength
得到的數字,並將其用作最大值。然後,在委託方法connection:didReceiveData
中,您將使用NSData實例的length
屬性來告訴您有多遠,因此您的進度分數將爲length/maxLength
,歸一化爲0.0到1.0之間。
最後,您將使用數據而不是URL初始化webview(在您的connection:didFinishLoading
委託方法中)。
兩個注意事項:
這是可能的NSURLResponse的expectedContentLength
屬性將是-1(NSURLReponseUnknownLength
不變)。在這種情況下,我會建議你在connection:didFinishLoading
內部關閉一個標準的UIActivityIndicator。
確保任何時候你的NSURLConnection的委託方法之一操作可見控制,您可以通過調用performSelectorOnMainThread:
這樣做 - 否則你會開始變得可怕EXC_BAD_ACCESS錯誤。
使用這種技術,可以顯示一個進度條,當你知道你應該有多少數據獲得,當你不知道的好手。
您可以嘗試使用UIWebView的這個使用私有UIWebView方法的子類 - 因此,此解決方案不是100%AppStore安全(儘管一些應用幾乎100%使用它:Facebook,Google應用...) 。
使用NSURLConnection的你兩次取相同的數據,浪費時間,因爲它可以減緩它加載數據的兩倍用戶交互,佔用網絡data.It是更好地做一個uiprogress基於計時器和webview成功加載網頁時,它會顯示加載。在這種情況下,你可以顯示一個動態uiprogress每次加載網頁..不要忘了創建一個uiprogress視圖,並將其命名爲myProgressview並將其設置爲文件所有者的。
這裏是代碼希望它有助於
@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
這個代碼和想法真的幫助我解決我的問題。
在UIWebView加載請求頂部實現NSURLConnection數據提取的問題是,您要抓取相同的數據兩次,這對輕量級連接是浪費的。您可以使用'loadData:MIMEType:textEncodingName:baseURL:'將NSData實例直接加載到UIWebView中,但這會損害使用UIWebView的其他方面。 – 2012-04-24 13:52:57