2

내가있는 UIWebView 함께 일하고 있어요 이미 webViewDidFinishLoad을 사용하고 있습니다 : 방법을 완료로드 한 후 실행됩니다 옵션 블록 :iOS UIWebView loadRequest에 완료 블록을 추가하는 방법은 무엇입니까?

-(void)webViewDidFinishLoad:(UIWebView *)webView 
    { 
     [super webViewDidFinishLoad:webView]; 

//... bunch of other code   

     if(self.webViewFinishLoadBlock != nil) 
     { 
      self.webViewFinishLoadBlock(); 
     } 
    } 

가 지금은 로딩 페이지 및 리디렉션의 더욱 복잡한 순서로 일하고 있어요 위의 논리는 충분하지 않습니다. 타사의 어떤 종류가 있습니까

:

dummyWebView = [[UIWebView alloc] initWithFrame:CGRectZero]; 
    [dummyWebView loadRequest:[NSURLRequest requestWithURL:logoutURL]]; 
//Ideally here I would know when dummyWebView finishes loading, because there's some code I want to execute once it is done 

내 질문은 : 내보기 컨트롤러의 속성에 저장된 여러 완료 블록을 저글링 dummyWebView의 대리인으로 자신을 등록하고 싶지 않아 콜백 코드 작성을 단순화하기 위해 loadRequest:withCompletion:을 사용할 수있는 프레임 워크?

답변

5

당신은 할 수있는 다음 webViewDidFinish 완료 블록을 보유하는 속성

  • 서브 클래스 UIWebView;

  • 대리인을 지정해야합니다.

  • webViewDidFinish을 작성한 것처럼 구현하십시오 (블록이 웹보기와 함께 NSError 개체를 반환하는 것이 좋습니다). 및

  • webView:didFailLoadWithError:도 구현하십시오.

따라서 :

// MyWebView.h 

#import <UIKit/UIKit.h> 

typedef void(^WebViewFinishLoadBlock)(UIWebView *, NSError *); 

@interface MyWebView : UIWebView 

@property(nonatomic, copy) WebViewFinishLoadBlock webViewFinishLoadBlock; 

- (void)loadRequest:(NSURLRequest *)request withCompletionHandler:(WebViewFinishLoadBlock)completionHandler; 

@end 

그리고

// MyWebView.m 

#import "MyWebView.h" 

@interface MyWebView() <UIWebViewDelegate> 
@end 

@implementation MyWebView 

- (void)loadRequest:(NSURLRequest *)request withCompletionHandler:(WebViewFinishLoadBlock)completionHandler 
{ 
    self.delegate = self; 
    self.webViewFinishLoadBlock = completionHandler; 

    [self loadRequest:request]; 
} 

#pragma mark - UIWebViewDelegate 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    if (self.webViewFinishLoadBlock) { 
     self.webViewFinishLoadBlock(webView, nil); 
     self.webViewFinishLoadBlock = nil; 
    } 
} 

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
{ 
    if (self.webViewFinishLoadBlock) { 
     self.webViewFinishLoadBlock(webView, error); 
     self.webViewFinishLoadBlock = nil; 
    } 
} 

@end 

그리고 :

MyWebView *webView = [[MyWebView alloc] init]; 
webView.frame = self.view.bounds; 
[self.view addSubview:webView]; 

NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
[webView loadRequest:request withCompletionHandler:^(UIWebView *webView, NSError *error) { 
    if (error) { 
     NSLog(@"failed: %@", error); 
    } else { 
     NSLog(@"succeeded"); 
    } 
}]; 
+1

우리는 스위프트이 코드를 얻을 수 있겠습니까? – Bharathi

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

은 대리인 메서드입니다. 관례에 따라 대리자 메서드를 사용하면 개체가 대리자에게 자신을 다시 전달해야합니다.

(UIWebView*)webView 

매개 변수를 통해.

우리가 부모 개체가 여러 객체에 대해 위임 될 수 있으며, 그것은 해당 매개 변수에 생각의 응답을 받고있는 식별 할 수 webView.request.URL

의미 특성 request:를 사용하여 마지막 요청 매개 변수를 얻을합니다. 응답하는 항목을 켜거나 좀 더 우아하게 처리 할 수있는 인프라를 구축하십시오.