Хорошо, используя предложение Нимрода, вот как я это сделал:
//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;
}
}
Я внес несколько незначительных изменений в свой код для презентации, но он в основном такой же, как я использую,HTML-строку в preparePage можно переместить для производственного кода.
Редактировать: внесенное мной изменение, которое может быть полезно для других, заключается в изменении appendMessage (msg) для создания новых элементов div вместо текстовых узлов,Это полезно, если вводимый текст содержит HTML-код, который вы хотите сохранить.
function appendMessage(msg) {
var msgNode = document.createElement('div');
msgNode.innerHTML = msg;
var logNode = document.getElementById('log');
logNode.appendChild(msgNode);
}