gpt4 book ai didi

iphone - 我的 UIWebView 正在延迟重新加载。当我想要显示数据时,如何使其重新加载/刷新?

转载 作者:行者123 更新时间:2023-12-03 20:57:21 25 4
gpt4 key购买 nike

我试图让 UIWebView 动态更新,有点像卡拉 OK 盒子,因为它通过 while 循环进行迭代。 tts 引擎正在说出的单词应为橙色(或在 html 中为 .style2)。

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

html 代码正在按应有的方式更新(语音单词为橙色),但 web View 并未反射(reflect)这一点。

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

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++;
}

最佳答案

我认为你的问题是 UIWebView 仅在控件返回到主 NSRunLoop/Event Loop 之后渲染 View 。因此,如果您在上面的 while 循环中进行所有更新,那么只有最后一个字符串被加载,因为它永远没有机会加载其他字符串(因此将仅使用最后一个加载请求)。

在 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”部分中有更多关于主要“事件循环”的信息。

关于iphone - 我的 UIWebView 正在延迟重新加载。当我想要显示数据时,如何使其重新加载/刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4140596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com