UIWebView stringByEvaluatingJavaScriptFromString не работает во второй раз

#ios #objective-c #uiwebview

#iOS #objective-c #uiwebview

Вопрос:

Внутри UITableViewController у меня есть UIWebView со stringByEvaluatingJavaScriptFromString, который правильно загружен с первого раза. Затем контроллер просмотра отключается при «закрытии» пользователя, затем его можно запросить снова.

 - (void)viewDidLoad {
  textComments.delegate=self;
NSString *path =[[[NSBundle mainBundle] bundlePath]
               stringByAppendingString:@"/demo.html"];
[textComments loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]];
}

-(void)webViewDidFinishLoad:(UIWebView *)_textComments{
  NSString * html_string = [NSString stringWithFormat:@"document.getElementById('editor1').innerHTML='%@';"
                            , self.commentHTML];
  [_textComments stringByEvaluatingJavaScriptFromString:html_string];
  [_textComments stringByEvaluatingJavaScriptFromString:@"document.getElementById('editor1').focus();"];
}
  

demo.html является HTML-файлом с текстовой областью:

 <textarea cols="80" id="editor1" name="editor1" rows="8">Content goes
here. ERROR: innerHTML not replaced!</textarea>
  

Идея состоит в том, чтобы заменить значение <textarea> содержимым переменной self.commentHTML.

При первой загрузке контроллера табличного представления он работает нормально, заменяя значение <textarea> на переменную self.commentHTML.commentHTML.

После завершения действия пользователя другой stringByEvaluatingJavaScriptFromString получает значение innerHTML, и оно также работает нормально, затем я удостоверяюсь, что закрываю выход UIWebView:

 [textComments stopLoading];
[textComments removeFromSuperview];
textComments.delegate=nil;
self.textComments=nil;
  

Пока все хорошо.
Проблема в том, что когда пользователь снова запускает контроллер просмотра, UIWebView загружается с предварительно загруженным demo.html содержимое, но JavaScript stringByEvaluatingJavaScriptFromString в webViewDidFinishLoad не загружается. Я уже убедился, что запускается webViewDidFinishLoad. Я также убедился, что didFailLoadWithError также не запускается.

Есть идеи о том, почему во второй раз, когда запускается контроллер представления, stringByEvaluatingJavaScriptFromString не выполняется?

Мне интересно, должен ли я уничтожить / освободить / разрядить что-то еще, чего я не предполагаю здесь при ЗАКРЫТИИ.

Большое спасибо за любую помощь.

Отредактируйте, чтобы включить полный demo.html:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>CKEditor</title>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <script type="text/javascript" src="ckeditor.js"></script>
</head>
<body><p><textarea cols="80" id="editor1" name="editor1" rows="8">Content goes here. ERROR: innerHTML not replaced!</textarea></p>
</body>
</html>
  

Комментарии:

1. Вы проверили документацию: ( developer.apple.com/library/mac/documentation/Cocoa/Conceptual /… ) или другие возможности ( developer.apple.com/library/ios/documentation/Cocoa/Reference / … )?

Ответ №1:

Здесь недостаточно кода, чтобы быть уверенным, но моим первым предположением было бы, что эта последовательность создает два отдельных элемента вашего dom с помощью <textarea id="editor1"> и что javascript действительно выполняется, но помещает содержимое в неправильную текстовую область.

Комментарии:

1. Спасибо за ваш ответ. Я отредактировал вопрос, чтобы добавить demo.html код.

2. У меня есть только один элемент DOM textarea на demo.html файл, как вы можете видеть. Интересно, есть ли какой-нибудь другой способ уничтожить экземпляр View Controller. Или для уничтожения вызовов Javascript в случае, если iOS считает, что UIWebView и его JS все еще активны.