2

読み込み時間を短縮するために、必要に応じて関連するローカルpngファイルとcssファイルを挿入しながら、UIWebView内のサーバーからWebページを表示する必要があるiOSアプリに取り組んでいます。これを行うために使用しているコードは次のとおりです。

NSData *myFileData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.example.com/index.html"]]];
NSString* myFileHtml = [[NSString alloc] initWithData:myFileData encoding:NSASCIIStringEncoding];
[myWebView loadHTMLString:myFileHtml baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];

私の問題は、一部のWebページに、サーバー上の他のWebページにリンクするボタンが含まれていることです。UIWebViewは文字列のみをロードしているため、ボタンをタップしても、UIWebViewは新しいWebページのURLをロードしません。 loadRequestメソッドを使用した場合。

私の質問は、baseurlからローカルファイルを挿入しながら、UIWebViewがリクエストをロードしているように動作させるにはどうすればよいですか?

ありがとう

4

2 に答える 2

0

NSURLPRotocolはNSURLConnectionのハンドラーであり、サーバーへの呼び出しをインターセプトして独自のコンテンツに置き換える機会を提供します。

1)NSURlProtocolからクラスを派生させる

2)アプリケーションでNSURLProtocol registerClass:を呼び出します:didFinishLaunchingWithOption

3)必要に応じて、これらのメソッドの実装に関するドキュメントをお読みください。initWithRequest:cachedResponse:client:、startLoading、URLProtocol:didReceiveResponse:cacheStoragePolicy:URLProtocolDidFinishLoading:

于 2012-06-05T15:09:49.373 に答える
0

リンクされたページはリモートサーバー上にあり、デバイスのファイルシステム上にはないため、ボタン内の相対リンクは機能しません。ただし、UIWebViewDelegateメソッドを使用して機能させることができます。

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

    if (navigationType == UIWebViewNavigationTypeLinkClicked) {
        NSString *localRootPath = [NSString stringWithFormat:@"file://%@", [[NSBundle mainBundle] bundlePath]];
        NSString *remoteRootPath = @"http://yourdomain.com";

        NSString *remotePath = [[request.URL absoluteString] stringByReplacingOccurrencesOfString:localRootPath withString:remoteRootPath]; 

        [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:remotePath]]];

        // or you can use your own loading mechanism here

        return NO;
    }

    return YES;
}

このメソッドは、WebViewからのすべての要求をインターセプトします。リクエストがユーザーのタップ/クリックによってトリガーされた場合、URLは相対URLから絶対URLに変更されるため、サーバーからロードできます。WebViewにデリゲートを設定することを忘れないでください。そうしないと、このメソッドは呼び出されません。

于 2012-06-06T07:45:26.460 に答える