2011-10-05 7 views
16

viewDidLoad에서로드하는 하나의 탭에 UIWebView가 있지만 사용자가 다른 탭을 탭하면로드가 중단되고 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error이 호출되지만 webView로드 여부를 확인할 수 있습니다. 사용자가 다시 이전 탭을 탭하고,이로드되어 있지 않은 경우는,이 ​​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에는 webViewDidFinishLoad 대리자 메서드가 있습니다. 이 작업이 완료되었음을 나타내는 bool을 설정하십시오.

- (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가 호출되므로 bool이 항상 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 속성도 사용해야합니다.

Apple 문서 : @property (nonatomic, readonly, getter = isLoading) BOOL 로딩 수신자가 콘텐츠를로드했는지 여부를 나타내는 부울 값입니다.

예인 경우 수신자가 여전히 콘텐츠를로드하고 있습니다. 그렇지 않으면 아니오.

iOS6 (베타 4)에서이 속성으로 Apple에서 일부 문제가 수정 된 것처럼 보입니다. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

1

원래 질문이 수년 전에 게시 된 것은 사실입니다. 최근이 문제에 대한 신뢰할 수있는 해결책을 찾아야했습니다. WKWebWiew에있는 UIWebView 대체

  1. : 여기

    은 나를 위해 일한 솔루션입니다.
  2. 'didFinishNavigation'대리자 메서드를 처리하는 동안 'evaluateJavaScript'코드가 추가되었습니다.

전체 코드는 다음과 같습니다

- (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); 
     } 
    }]; 
}