[英]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.