2011-10-05 9 views
16

मेरे पास एक टैब में UIWebView है जो दृश्य में लोड होता है, लेकिन अगर उपयोगकर्ता अन्य टैब टैप करता है तो लोडिंग बाधित हो जाएगी और - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error कॉल किया जाएगा, लेकिन मैं जानना चाहता हूं कि वेबव्यू लोड हो गया है या नहीं उपयोगकर्ता फिर से पिछले टैब टैप करता, और अगर यह लोड नहीं है यह यह पुनः लोड होगा, इसजांचें कि क्या UIWebView लोड किया गया है

-(void)viewWillAppear:(BOOL)animated 
{ 
    if (!webView) 
     { 
      NSURL *url = [NSURL URLWithString:@"url"]; 
      NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
      [webView loadRequest:request]; 
     } 

    } 

की तरह कुछ लेकिन यह काम नहीं कर रहा हो, तो कृपया मदद?

+0

एकमात्र समाधान (मैंने पाया) जो ठीक काम करता है: http://stackoverflow.com/questions/1662565/uiwebview-finished-loading-event/25620001# 25620001 – sabiland

उत्तर

27

UIWebview में एक वेब व्यूडिडफिनिश लोड प्रतिनिधि विधि है। यह इंगित करने के लिए एक बूल सेट करें।

- (void)webViewDidStartLoad:(UIWebView *)webView { 

webViewDidFinishLoadBool = NO; 
loadFailedBool = NO; 

} 


- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 

loadFailedBool = YES; 
} 


- (void)webViewDidFinishLoad:(UIWebView *)webView { 

    if (!loadFailedBool) 
    webViewDidFinishLoadBool = YES; 

} 
+0

काम नहीं कर रहा है ...:/ – vburojevic

+0

कौन सा हिस्सा काम नहीं कर रहा है? प्रतिनिधि विधियों को बुलाया जा रहा है? – Zigglzworth

+0

हां, लेकिन समस्या यह है कि webviewdidfinishload को लोड होने में विफल होने के बाद बुलाया जाता है, इसलिए बूल हमेशा YES – vburojevic

8

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

हैडर:

@interface MyViewController : UIViewController <UIWebViewDelegate> { 
    BOOL wasLoaded; 
    BOOL alertWasShown; 
} 

@property (nonatomic, retain) IBOutlet UIWebView *myWebView; 

@end 

कार्यान्वयन:

- (void)loadWebView:(NSString *)urlString { 
    if (wasLoaded == NO) { 
     NSURL *url = [NSURL URLWithString:urlString]; 
     NSURLRequest *requestObject = [NSURLRequest requestWithURL:url]; 
     [myWebView loadRequest:requestObject]; 
    } 
} 

- (void)viewWillAppear:(BOOL)animated { 
    NSString *urlString = @"put your url here"; 
    [self loadWebView:urlString]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    wasLoaded = NO; 
    alertWasShown = NO; 
    myWebView.delegate = self; 
} 

- (void)webViewDidStartLoad:(UIWebView *)webView { 
    // Not necessary to do anything here. 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    wasLoaded = YES; // Indicates that it finished loading. 
} 

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 
    if (alertWasShown == NO) { 
     UIAlertView *alert = ... // Create an alert. 
     [alert show]; 

     alertWasShown = YES; 
    } 
} 

मुझे आशा है कि मदद करता है।

0

एकाधिक फ्रेम वाले पृष्ठों के लिए, UIWebView.loading प्रॉपर्टी का भी उपयोग किया जाना चाहिए।

ऐप्पल का डॉक्टर: @property (nonatomic, readonly, getter = isLoading) बूल लोडिंग एक बूलियन मान इंगित करता है कि रिसीवर सामग्री लोड हो रहा है या नहीं।

यदि हां, तो रिसीवर अभी भी सामग्री लोड कर रहा है; अन्यथा, नहीं।

आईओएस 6 (बीटा 4) में ऐसा लगता है कि ऐप्पल ने इस संपत्ति के साथ कुछ मुद्दों को भी ठीक किया है। http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

1

यह सच है कि मूल प्रश्न कई साल पहले पोस्ट किया गया था। हाल ही में मुझे इस मुद्दे के लिए एक विश्वसनीय समाधान मिलना पड़ा।

  1. WKWebWiew से बदला UIWebView:

    यहाँ समाधान है कि मेरे लिए काम किया है।

  2. 'didFinishNavigation' प्रतिनिधि विधि को संभालने के दौरान 'मूल्यांकन जावास्क्रिप्ट' कोड जोड़ा गया।

पूरा कोड है:

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{ 
    [webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) { 
     if (result != nil) { 
      // Call your method here 
     } 
     if(error) { 
      NSLog(@"evaluateJavaScript error : %@", error.localizedDescription); 
     } 
    }]; 
}