2

Я работаю с UIWebView, и я уже использую webViewDidFinishLoad: метод с дополнительным блоком, который запускается на выполнение после загрузки полного:iOS Как я могу добавить блок завершения в UIWebView loadRequest :?

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

//... bunch of other code   

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

Сейчас я работаю с еще более сложной последовательностью загрузки страниц и переадресовывает что делает логику выше недостаточно. Я не хочу, чтобы зарегистрировать себя в качестве делегата от dummyWebView и придется жонглировать несколько блоков завершения, хранящиеся в свойствах моего зрения контроллера:

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 

Мой вопрос:

Есть ли какой-то третьей стороны что позволит мне использовать loadRequest:withCompletion: для упрощения написания кода обратного вызова?

ответ

5

Вы можете просто:

  • Подкласс UIWebView со свойством удерживать блок webViewDidFinish завершения;

  • Обязательно укажите его делегат;

  • Внесите 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

нам получить этот код для Swift? – Bharathi

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

- это метод делегата. По методам делегата делегата требуется передать объект обратно делегату:

(UIWebView*)webView 

Через параметр.

Если мы хотим получить последний параметр запроса, используя свойство request:, что означает webView.request.URL

Родительский объект может быть делегатом для нескольких объектов, и он может определить, какой он получает ответ от хотя этого параметра. Либо переключитесь на то, что вам ответит, либо постройте некоторую инфраструктуру, чтобы обрабатывать ее более элегантно.

Смежные вопросы