2009-12-14 73 views
11

我正在開發一個應用程序,我在UIWebView中加載urlrequest,並且它成功發生。如何在加載UIWebView時使用UIProgressView?

但現在我試圖顯示一個UIProgressView加載過程中(從0.0開始到1.0),這是隨着加載進度動態改變。

我該怎麼做?

回答

21

UIWebView在正常模式下不會給你任何進度信息。你需要做的是首先使用NSURLConnection異步獲取你的數據。 當NSURLConnection委託方法connection:didReceiveResponse,你將採取從expectedContentLength得到的數字,並將其用作最大值。然後,在委託方法connection:didReceiveData中,您將使用NSData實例的length屬性來告訴您有多遠,因此您的進度分數將爲length/maxLength,歸一化爲0.0到1.0之間。

最後,您將使用數據而不是URL初始化webview(在您的connection:didFinishLoading委託方法中)。

兩個注意事項:

  1. 這是可能的NSURLResponse的expectedContentLength屬性將是-1NSURLReponseUnknownLength不變)。在這種情況下,我會建議你在connection:didFinishLoading內部關閉一個標準的UIActivityIndi​​cator。

  2. 確保任何時候你的NSURLConnection的委託方法之一操作可見控制,您可以通過調用performSelectorOnMainThread:這樣做 - 否則你會開始變得可怕EXC_BAD_ACCESS錯誤。

使用這種技術,可以顯示一個進度條,當你知道你應該有多少數據獲得,當你不知道的好手。

+0

在UIWebView加載請求頂部實現NSURLConnection數據提取的問題是,您要抓取相同的數據兩次,這對輕量級連接是浪費的。您可以使用'loadData:MIMEType:textEncodingName:baseURL:'將NSData實例直接加載到UIWebView中,但這會損害使用UIWebView的其他方面。 – 2012-04-24 13:52:57

2

您可以嘗試使用UIWebView的這個使用私有UIWebView方法的子類 - 因此,此解決方案不是100%AppStore安全(儘管一些應用幾乎100%使用它:Facebook,Google應用...) 。

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

-2

使用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 

這個代碼和想法真的幫助我解決我的問題。