gpt4 book ai didi

iOS 如何向 UIWebView loadRequest :? 添加完成 block

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:58:01 24 4
gpt4 key购买 nike

我正在使用 UIWebView,并且已经在使用 webViewDidFinishLoad: 方法和一个在加载完成后执行的可选 block :

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

//... bunch of other code

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

现在我正在处理一个更加复杂的加载页面和重定向序列,这使得上面的逻辑不够充分。我不想将自己注册为 dummyWebView 的委托(delegate),并且不得不处理存储在我的 View Controller 属性中的多个完成 block :

    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 完成 block 的属性;

  • 确保它指定了它的委托(delegate);

  • 像您编写的那样实现 webViewDidFinish(尽管我建议该 block 同时返回 Web View 和 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");
}
}];

关于iOS 如何向 UIWebView loadRequest :? 添加完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26531345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com