0

ローカルのhtmlファイルからUIWebViewのコンテンツをロードおよびリロードする方法はたくさんありますが、問題が再発し続けているようです。

私のプロジェクトには、XCodeプロジェクトにある50の異なるHTMLファイルの1つから取得したHTMLコンテンツを動的にロードするwebViewがあります。ユーザーが以前にviewControllerで押したボタンに応じて、別のHTMLファイルを使用してwebViewのコンテンツを再読み込みします。ほとんどの場合はすべて正常に機能しますが、webViewDidFinishLoadデリゲートメソッドが呼び出された後、webViewは単に「(null)」を表示することがあります。

何が起こっているのかわかりません。このviewControllerを行ったり来たりして、webViewがリロードされると、最終的に同じHTMLファイルに対してHTMLコンテンツが正しく表示されます。

これがwebViewにHTMLをロードするためのコードです(viewWillAppearメソッドから呼び出されます):

  - (void) reloadWebViewFromLocalFile{

    // Reset the UIWebView
    [self.contentWebView removeFromSuperview];
    self.contentWebView = nil;
    self.contentWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
    [self.contentWebView setContentMode:UIViewContentModeScaleAspectFit];
    [self.contentWebView setDelegate:self];
    [self.contentScrollView addSubview:self.contentWebView];
    [self.contentWebView release];

    NSString *fileName = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d.%d",self.currentIndexPath.section+1,self.currentIndexPath.row+1] ofType:@"html"];

    NSString *CSSContent = [NSString stringWithFormat:@"<style type=\"text/css\">body{padding-left:8px;padding-right:8px;font-family:\"%@\";}p{text-align:justify;}img{max-width:300px;display:block; margin:auto;}strong{font-family:\"%@\";}h1{font-size:20;font-family:\"%@\"}h2{font-size:18;font-family:\"%@\"}h3{font-size:17;font-family:\"%@\"}</style><script type=\"text/javascript\">touchMove = function(event) {event.preventDefault();}</script>", FONT_STAG_BOOK, FONT_STAG_SEMIBOLD, FONT_STAG_SEMIBOLD, FONT_STAG_SEMIBOLD, FONT_STAG_SEMIBOLD];

    self.HTMLString = [NSString stringWithFormat:@"<html><head>%@</head>%@</html>",CSSContent,[NSString stringWithUTF8String:[[NSData dataWithContentsOfFile:fileName] bytes]]];
[self.contentWebView loadHTMLString:self.HTMLString baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
}

これはwebViewDidFinishLoadデリゲートメソッドです:

    - (void)webViewDidFinishLoad:(UIWebView *)webView{

    NSString *stringContent = [self.contentWebView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];

        float height = [[self.contentWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] floatValue] + 20;
        [self.contentWebView setFrame:CGRectMake(0, 0, 320, height)];
        [self.contentScrollView setContentSize:CGSizeMake(0, height+self.nextButton.frame.size.height)];

        [self.nextButton setFrame:CGRectMake(0, height, 320, self.nextButton.frame.size.height)];

        if ([self.contentWebView respondsToSelector:@selector(scrollView)]) {
            self.contentWebView.scrollView.scrollEnabled = NO; // available starting in iOS 5
        } else {
            for (id subview in self.contentWebView .subviews)
                if ([[subview class] isSubclassOfClass: [UIScrollView class]])
                    ((UIScrollView *)subview).scrollEnabled = NO;
        }
}

編集:WebViewに実際にHTML文字列をロードする行をコピーして貼り付けるのを忘れた

4

1 に答える 1

0

問題はbytes関数の使用にあるようですが、コンテンツのエンコードが正確でない場合はうまく機能しません...

[NSString stringWithUTF8String:[[NSData dataWithContentsOfFile:fileName] bytes]];

する必要があります

[[NSString alloc] initWithData:[NSData dataWithContentsOfFile:fileName] encoding:NSUTF8StringEncoding];
于 2012-11-05T14:15:44.003 に答える