[英]iOS how can I add a completion block to UIWebView loadRequest:?
我正在使用UIWebView,並且我已經在使用帶有可選塊的webViewDidFinishLoad:方法,該塊在加載完成后執行:
-(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:
簡化編寫回調代碼?
你可以:
具有屬性的子類UIWebView
用於保存webViewDidFinish
完成塊;
確保它指定了其委托;
實現webViewDidFinish
就像你寫的那樣(盡管我建議塊返回web視圖以及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");
}
}];
- (void)webViewDidFinishLoad:(UIWebView *)webView
是一種委托方法。 按照慣例,委托方法要求對象將自身傳遞回委托:
(UIWebView*)webView
通過參數。
如果我們想使用屬性request:
獲取最后一個請求參數request:
這意味着webView.request.URL
父對象可以是多個對象的委托,它可以識別從該參數獲得響應的對象。 要么打開響應你的東西,要么建立一些基礎設施來更優雅地處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.