Javascript 使用UIWebView显示和查看日志

Javascript 使用UIWebView显示和查看日志,javascript,iphone,objective-c,cocoa-touch,uikit,Javascript,Iphone,Objective C,Cocoa Touch,Uikit,我的应用程序正在从web服务中分块检索文本。我正在使用UIWebView显示格式化文本。到目前为止还不错 我的问题是,当每个块到达时,我需要用新内容刷新web视图。我使用KVO来观察文本中的变化,当文本发生变化时,我会调用KVO [self loadHTMLString:self.log.text baseURL:nil]; 重新显示包含更新文本的页面。不幸的是,这会重新加载整个页面,重置用户的当前位置和缩放 有没有办法请求web视图只刷新文本(假设它保留文本),或者向当前web视图中插入新的

我的应用程序正在从web服务中分块检索文本。我正在使用UIWebView显示格式化文本。到目前为止还不错

我的问题是,当每个块到达时,我需要用新内容刷新web视图。我使用KVO来观察文本中的变化,当文本发生变化时,我会调用KVO

[self loadHTMLString:self.log.text baseURL:nil];
重新显示包含更新文本的页面。不幸的是,这会重新加载整个页面,重置用户的当前位置和缩放


有没有办法请求web视图只刷新文本(假设它保留文本),或者向当前web视图中插入新的next/html?

您可以使用

(NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
以及某种类型的javascript函数(比如innerHTML),用于向HTML添加内容


不幸的是,我不是足够的javascript专家,无法为javascript部分提供一个示例。有人吗?

好的,根据尼姆罗德的建议,我是这样做的:

//Called on first display. Sets up basic page, and a javascript function to
//next log segments at the end of the a div
- (void) preparePage{
    NSString *basePage = 
        @"<html><body>"
        "<script type=\"text/javascript\">"
            "function appendMessage(msg) {"
                "var msgNode = document.createTextNode(msg);"
                "var logNode = document.getElementById(\"log\");"
                "logNode.appendChild(msgNode); }"
        "</script>"       
        "<div id=\"log\" style=\"width:80em; white-space:pre-wrap;\"></div>"
        "</body></html>";
    [self.logView loadHTMLString:basePage baseURL:nil];
    [self updateHTMLFromLog];
}

//Called when the log has changed. Keeps track of current position, and inserts
//new segments into the page using the javascript function created in preparePage
- (void) updateHTMLFromLog{
    // loop through new log chunks, using Javascript to inject them into the page
    while(self.logPosition < [self.log.segments count]){
        //escape double quotes to avoid breaking string
        NSString *message = [self.log.segments objectAtIndex:self.logPosition] stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
        NSString *jsString = [NSString stringWithFormat:@"message = \"%@\";appendMessage(message);", message];
        [self.logView stringByEvaluatingJavaScriptFromString:jsString];
        ++self.logPosition;
    }
}

为什么不在刷新内容之前保存当前缩放/位置。在完成加载过程时,您将重置位置并缩放回保存的值。虽然我喜欢您的想法,因为它使模型保持不变,但UIWebView中似乎没有任何方法或属性用于获取或设置缩放和位置。我可以用javascript来实现,但在这种情况下,我也可以按照Nimrod的建议,使用javascript来注入新文本(完全避免重新加载)。我自己对javascript了解不多,但我身边有一些人是这样做的。我必须对我的模型进行一些修改,以使其发挥作用,但无论如何,它可能会变得更好。当你发现它是什么时,请将其作为评论发布在这里。我很想知道,因为我可能会在某个时候使用它。我已经在下面的答案中发布了我的代码,只做了一些小的修改。
function appendMessage(msg) {
    var msgNode = document.createElement('div');
    msgNode.innerHTML = msg;
    var logNode = document.getElementById('log');
    logNode.appendChild(msgNode);
}