2009-12-14 23 views
11

मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जहां मैं UIWebView में urlrequest लोड कर रहा हूं और यह सफलतापूर्वक हुआ।UIWebView लोड करते समय UIProgressView का उपयोग कैसे करें?

लेकिन अब लोडिंग प्रगति पर है (0.0 से 1.0 से शुरू होने पर, मैं एक UIProgressView प्रदर्शित करने की कोशिश कर रहा हूं), जो लोड होने की प्रगति के साथ गतिशील रूप से बदल दिया गया है।

मैं यह कैसे कर सकता हूं?

उत्तर

21

UIWebView आपको सामान्य मोड में कोई प्रगति जानकारी नहीं देता है। आपको जो करना है वह पहले NSRLConnection का उपयोग करके अपने डेटा को असीमित रूप से लाता है। जब NSURLConnection प्रतिनिधि विधि connection:didReceiveResponse, तो आपको expectedContentLength से प्राप्त होने वाली संख्या लेने जा रहे हैं और इसे अपने अधिकतम मान के रूप में उपयोग करें। फिर, प्रतिनिधि विधि connection:didReceiveData के अंदर, आप एनएसडीएटी इंस्टेंस की length संपत्ति का उपयोग करने जा रहे हैं ताकि आपको यह बताने के लिए कि आप कितने दूर हैं, इसलिए आपका प्रगति अंश length/maxLength होगा, जो सामान्यतः 0.0 और 1.0 के बीच होगा।

अंत में, आप एक यूआरएल के बजाय डेटा के साथ वेबव्यू में प्रवेश करने जा रहे हैं (आपके connection:didFinishLoading प्रतिनिधि विधि में)।

दो चेतावनियां:

  1. यह संभव है कि NSURLResponse की expectedContentLength संपत्ति -1 (NSURLReponseUnknownLength निरंतर) होने जा रहा है है। उस स्थिति में, मैं एक मानक यूआईएक्टिविटी इंडिकेटर को फेंकने का सुझाव दूंगा कि आपने connection:didFinishLoading के अंदर बंद कर दिया है।

  2. सुनिश्चित करें कि जब भी आप NSURLConnection प्रतिनिधि विधियों में से किसी एक से दृश्य नियंत्रण में हेरफेर करते हैं, तो आप performSelectorOnMainThread: पर कॉल करके ऐसा करते हैं - अन्यथा आप डरावनी EXC_BAD_ACCESS त्रुटियां प्राप्त करना शुरू कर देंगे।

इस तकनीक का उपयोग करके आप एक प्रगति बार दिखा सकते हैं जब आप जानते हैं कि आप कितना डेटा प्राप्त करने के लिए माना जाता रहे हैं, और एक स्पिनर जब आप पता नहीं है।

+0

UIWebView लोड अनुरोध के शीर्ष पर NSURLConnection डेटा लाने के साथ समस्या यह है कि आप एक ही डेटा को दो बार पकड़ रहे हैं, जो हल्के कनेक्शन पर अपर्याप्त है। आप NSWataView को सीधे UIWebView में लोड कर सकते हैं 'लोडडाटा: MIMEType: textEncodingName: baseURL:', लेकिन यह UIWebView का उपयोग करने के अन्य पहलुओं से समझौता कर सकता है। –

2

आप UIWebView के इस सबक्लास का उपयोग करने का प्रयास कर सकते हैं जो निजी UIWebView विधियों का उपयोग करता है - इसलिए, यह समाधान 100% ऐपस्टोर सुरक्षित नहीं है (हालांकि कुछ ऐप्स लगभग 100% इसका उपयोग करते हैं: फेसबुक, Google ऐप, ...) ।

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

-2

NSURLConnection का उपयोग करके आप एक ही डेटा दो बार समय की बर्बादी फ़ेच कर रहे हैं, क्योंकि यह उपयोगकर्ता बातचीत इसे दो बार डेटा लोड करता है, धीमा कर सकते हैं खपत इंटरनेट data.It एक uiprogress के आधार पर बनाने के लिए बेहतर है टाइमर और जब वेबव्यू सफलतापूर्वक वेबपृष्ठ को लोड करता है तो यह यूप्रेशंस लोडिंग दिखाएगा। उस स्थिति में आप वेबपृष्ठ लोड होने पर हर बार एक गतिशील यूप्रेशंस दिखा सकते हैं .. यूप्रेशंस व्यू बनाना न भूलें और इसे मेरा प्रोग्रेसव्यू नाम दें और इसे फ़ाइल स्वामी के रूप में सेट करें ।

यहां कोड आशा है कि यह मदद मिलती है

@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 

इस कोड और विचार वास्तव में मेरी समस्या को हल करने में मुझे मदद मिलती है।

संबंधित मुद्दे