0

この質問は少し奇妙/奇妙に思えるかもしれませんが、2 つの UIWebView があり、そのうちの 1 つは .xib ファイルで非表示に設定されており、ビュー コントローラーにデリゲートが設定されています。2 番目の UIWebView は、非表示の UIWebView から html を解析して「クリーンアップ」し、「動員された」ページとしてユーザーに表示するために使用されます。私の .xib ファイルには非表示の UIWebView にはデリゲートがありません。

私が抱えている問題は、2 番目の UIWebView の読み込みが終了したときに、ユーザーが 2 番目の UIWebView 内のリンクをタップすると、解析されていない Web ページの読み込みが終了することです。ロードが完了すると、2 番目の UIWebView がそれを解析できるようにロードされます。私の 2 つの 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])];
}
4

2 に答える 2

2

デリゲートメソッドを実装できます

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

これにより、ロード要求をインターセプトしてキャンセルできます。次に、リクエストからURLを取得して、非表示のWebビューに渡すことができます。唯一の注意点は、IIRCです。このメソッドは、自分でロードするリクエストに対しても呼び出されるため、引数-loadRequest:を確認する必要があります。navigationType

于 2012-12-07T01:22:20.717 に答える
0

使えるはずです- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType。リクエストを最初の webView に転送しNO、2 番目の webView がページをロードしないように戻します。

于 2012-12-07T01:23:49.780 に答える