两个 UIWebViews,如何设置第二个 Web 视图,以便在单击链接时将它们发送到第一个 Web 视图进行加载



这个问题可能看起来有点奇怪/奇怪,但我有两个UIWebViews,其中一个设置为隐藏在.xib文件中,并且它被委托设置为我的视图控制器。第二个UIWebView用于解析和"清理"隐藏UIWebView中的html,并将其显示为"移动"页面给用户。在我的 .xib 文件中,非隐藏的 UIWebView 上没有委托。

我遇到的问题是,当第二个 UIWebView 完成加载时,用户点击第二个 UIWebView 中的一个链接,它完成了加载未解析的网页,因为它没有将此链接单击发送回要加载的隐藏 UIWebView,以便第二个 UIWebView 可以在完成加载时解析它。我的两个UIWebView是我的.m文件中的属性。

有什么办法可以解决这个问题吗?我感谢提供的任何回复!如果我没有清楚地说明我的问题,请告诉我!

一些代码:

.h:

#import <UIKit/UIKit.h>
@interface Web : UIViewController <UIWebViewDelegate>
@property (nonatomic, strong) NSURL *url;
@end

.m:

#import "Web.h"
@interface  Web()
@property (nonatomic, strong) IBOutlet UIWebView *webView2;
@property (nonatomic, strong) IBOutlet UIWebView *webView;
@property (nonatomic, strong) NSMutableString *output;
@property (nonatomic, strong) NSString *wrapper;
@end
@implementation Web
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{   
    if(webView == self.webView2)
    {
        [self.webView loadRequest:(NSURLRequest*)request];
    }
    else
    {
        [self.webView loadRequest:(NSURLRequest*)request];
    }
    return NO;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{   
    [self cleanUp];
    [self.webView2 loadHTMLString:self.output baseURL:nil];
}
- (void)cleanUp
{
    NSString *input = [self.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById("ctl_ctl_cphBody_cphCenter_divHtml").innerHTML;"];
    NSString *breadcrumbString = [self.webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByClassName('breadcrumb')[0].outerHTML;"];
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        self.wrapper = @"<html><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><meta name="viewport" content="initial-scale = 1.37,maximum-scale = 2.0"/></html>";
    }
    else
    {
       self.wrapper = @"<html><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><meta name="viewport" content="initial-scale = 0.57,maximum-scale = 2.0"/></html>";
    }
    self.output = [NSMutableString stringWithString:self.wrapper];
    [self.output insertString:input atIndex:147];
    [self.output replaceOccurrencesOfString:breadcrumbString withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [self.output length])];
}

您可以实现委托方法

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

这使您可以拦截加载请求并取消它们。然后,您可以从请求中获取 URL 并将其交给隐藏的 Web 视图。唯一需要注意的是,IIRC,即使对于您加载自己-loadRequest:的请求,也会调用此方法,因此您需要检查navigationType参数。

您应该能够使用 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType .将请求转发到第一个 Web 视图并返回NO以防止第二个 Web 视图加载页面。

最新更新