我的UIWebView懒得重装。当我想要显示数据时,如何重新加载/刷新?

时间:2010-11-10 01:59:25

标签: iphone cocoa-touch uiwebview

我试图让UIWebView动态更新,有点像卡拉OK盒,因为它迭代了一个while循环。 tts引擎所说的那个词应该是橙色的(或者是html,.style2)。

然而,正在发生的事情是UIWebView不会通过htmlKaraoke字符串的每次迭代更新其显示,而只会更新while循环中的最后一次。 UIWebView似乎以惰性方式重新加载,并等待while循环完成后再更新它的显示。我已经在我的代码中包含了我尝试绕过它的所有不同方法(setNeedsDisplay,setNeedsLayout,重置htmlKaraoke字符串,重新加载UIWebView)但我似乎无法让它做我想要的。

html代码正在更新(使用橙色的口语),但是webview没有反映这一点。

如何在每次更新htmlKaraoke字符串后更新webView?

i = 0;
NSString *htmlHead              = @"<html><head><style type='text/css'><!-- .style1 { font-size: 24px; font-weight: bold; font-family: Helvetica; } .style2 {color: #FF9900} --> </style></head><body><span class='style1'>";
NSString *htmlFoot              = @"</span></body></html>";
NSString *htmlEmpHead           = @"<span class='style2'>";
NSString *htmlEmpFoot           = @"</span>";
NSMutableString *htmlKaraoke = [[NSMutableString alloc] init];

while(i <= wordWeAreUpToInt){
    //wait until the tts is finished talking.
    if(![[fliteEngine audioPlayer] isPlaying]){
        //NSLog(@"flite is finished!");

        //Add the word and highlight in the karaoke

            /*  Clear the html string
                Make a for loop, where n = 0, n<i, n++
                    append black word
                when for loop ends, and n == i, add an emph word (n==i when i is the currently spoken word). 
             */
        [karaokeWebView loadHTMLString:@" " baseURL:nil];
        [karaokeWebView reload]; //doesn't do anything. These two lines are a waste of breath. 

        [htmlKaraoke setString:htmlHead];
        for (int n = 0; n<i; n++) {
            [htmlKaraoke appendString:[wordsArray objectAtIndex:n]];
            [htmlKaraoke appendString:@" "];
        }
        [htmlKaraoke appendString:htmlEmpHead];
        [htmlKaraoke appendString:[wordsArray objectAtIndex:i]];
        [htmlKaraoke appendString:@" "];
        [htmlKaraoke appendString:htmlEmpFoot];
        NSLog(@"Emphasis: %@", [wordsArray objectAtIndex:i]);           
        [htmlKaraoke appendString:htmlFoot];


        NSLog(@"htmlKaraoke: %@", htmlKaraoke);

        [karaokeWebView loadHTMLString:htmlKaraoke baseURL:nil];
        [karaokeWebView setNeedsDisplay];
        [karaokeWebView setNeedsLayout]; //getting desperate....!

        //speak the word
        [self readSentence:[wordsArray objectAtIndex:i]];
        i++;
    }
}

[htmlKaraoke release];
wordWeAreUpToInt++;
}

1 个答案:

答案 0 :(得分:3)

我认为您的问题是UIWebView仅在控件返回主NSRunLoop / Event循环后呈现视图。所以,如果你在上面的while循环中进行所有更新,那么只有最后一个字符串被加载,因为它从来没有机会加载其他字符串(&amp; so所以只使用最后一个加载请求)。 / p>

您将需要退回您编写的任何代码(不仅是此方法,还包括触发此调用的任何内容等)并将控制权返回给操作系统,然后UIWebView将根据您的更改进行更新。

假设在控制返回后该代码所在的任何对象仍然存在,您可以通过将其添加到您的类来测试它:

- (void)loadHTMLString:(NSString *)string {
    [karaokeWebView loadHTMLString:string baseURL:nil];
}

然后将-[loadHTMLString:baseURL:]来电更改为:

[self performSelector:@selector(loadHTMLString:) withObject:htmlKaraoke afterDelay:_delay_increasing_by_a_second_for_each_string];

“iOS应用程序编程指南”的“Application Life Cycle”部分中的主“事件循环”还有更多内容。