我试图让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++;
}
答案 0 :(得分:3)
我认为您的问题是UIWebView仅在控件返回主NSRunLoop / Event循环后呈现视图。所以,如果你在上面的while循环中进行所有更新,那么只有最后一个字符串被加载,因为它从来没有机会加载其他字符串(&amp; so所以只使用最后一个加载请求)。 / p>
您将需要退回您编写的任何代码(不仅是此方法,还包括触发此调用的任何内容等)并将控制权返回给操作系统,然后UIWebView将根据您的更改进行更新。 假设在控制返回后该代码所在的任何对象仍然存在,您可以通过将其添加到您的类来测试它: 然后将 “iOS应用程序编程指南”的“Application Life Cycle”部分中的主“事件循环”还有更多内容。- (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];