【问题标题】:Two UIWebViews, how to set the second webview so when links are clicked it sends them to the first webview to load?两个 UIWebViews,如何设置第二个 webview,以便在单击链接时将它们发送到第一个 webview 加载?
【发布时间】:2012-11-25 04:21:45
【问题描述】:

这个问题可能看起来有点奇怪/奇怪,但我有两个 UIWebView,其中一个设置为隐藏在 .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])];
}

【问题讨论】:

    标签: iphone objective-c ios ipad uiwebview


    【解决方案1】:

    你可以实现委托方法

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

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

    【讨论】:

    • 我能够从第二个 webview 中获取请求的 url 并将其输入隐藏的 webview,但它无法正常工作;我的 NSLog 说请求的 url 是空白的,它会继续加载它,但它不会“动员”加载的网页。
    • 具体来说,当我尝试这段代码时:[self.webView loadRequest:self.webView2.request]; 它会加载一个空白页面,其中只有我的包装器 NSString,没有内容。
    【解决方案2】:

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

    【讨论】:

    • 你能详细说明一下吗?我使用上面的- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType 方法编辑了上面的代码,但它对我不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2019-12-12
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多