Использование UIWebView для отображения и просмотра журнала - PullRequest
1 голос
/ 18 октября 2010

Мое приложение извлекает текст из веб-службы порциями.Я отображаю форматированный текст с помощью UIWebView.Пока все хорошо.

Моя проблема в том, что когда приходит каждый чанк, мне нужно обновить веб-представление новым контентом.Я использую KVO для наблюдения за изменениями в тексте, и когда текст меняется, я звоню

[self loadHTMLString:self.log.text baseURL:nil];

, чтобы заново отобразить страницу с обновленным текстом.К сожалению, это перезагружает всю страницу, сбрасывая текущее положение и масштабирование пользователей.

Есть ли способ либо запросить веб-представление просто обновить текст (при условии, что он сохраняет его), либо добавить новый следующий /HTML в текущем веб-просмотра?

Ответы [ 2 ]

1 голос
/ 21 октября 2010

Хорошо, используя предложение Нимрода, вот как я это сделал:

//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);
}
1 голос
/ 18 октября 2010

Вы можете добавить новый контент на страницу, используя

(NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script

и какая-то функция javascript (например, innerHTML) для добавления содержимого в HTML.

К сожалению, мне не хватает специалиста по javascript, чтобы предоставить пример для части javascript. Кто-нибудь? * * 1006

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...