Определение завершения stringByEvaluatingJavaScriptFromString

У меня есть UIWebView, который загружает HTML-страницу. На этой странице есть две кнопки, например "Выход и отправка". Я не хочу, чтобы пользователи могли нажимать кнопку "Выход" , поэтому после завершения загрузки страницы (т.е. webViewDidFinishLoad) я использую stringByEvaluatingJavaScriptFromString для удаления одной из этих кнопок, манипулируя HTML. Я также отключил взаимодействие пользователя с UIWebView на webViewDidStartLoad и снова включил его на webViewDidFinishLoad.

Проблема, которую я нахожу, заключается в том, что stringByEvaluatingJavaScriptFromString занимает второй или две, чтобы завершить, и, похоже, это делается в ней собственной нитью. Так что происходит то, что вызывается webViewDidFinishLoad, взаимодействие с пользователем включено в UIWebView, и если пользователь работает быстро, они могут нажать кнопку "Выход" до завершения stringByEvaluatingJavaScriptFromString. Поскольку stringByEvaluatingJavaScriptFromString, похоже, находится на нем в своем потоке, не имея возможности узнать, когда он закончил (он не вызывает webViewDidFinishLoad), единственный способ полностью запретить пользователям нажимать кнопку "Выход" , которую я вижу, - это включить только взаимодействие с пользователем на UIWebView после некоторой задержки, что ненадежно (как я могу действительно знать, как долго задерживаться?).

Правильно ли, что stringByEvaluatingJavaScriptFromString выполняется на нем по потоку, и я не могу сказать, когда он закончит? Любые другие предложения о том, как обойти эту проблему?

EDIT:. Короче говоря, я хочу знать, можно ли отключить UIWebView, пока выполняется stringByEvaluatingJavaScriptFromString, и снова включить UIWebView, когда javascript закончил.

РЕДАКТИРОВАТЬ 2: Здесь есть статья, которая, как представляется, может каким-то образом опросить механизм JS, чтобы увидеть, когда она закончится, но я не могу найти никаких других ссылок, говорящих одно и то же: http://drnicwilliams.com/2008/11/10/to-webkit-or-not-to-webkit-within-your-iphone-app/

РЕДАКТИРОВАТЬ 3 Основываясь на ответе Брэда Смита, мне кажется, что мне действительно нужно знать, когда UIWebView закончил загрузку после выполнения javascript. Он выглядит все более и более похожим на то, что мне просто нужно поместить там задержки.

Ответы

Ответ 1

У вас может быть javascript, который вы вводите на страницу, попытайтесь перемещаться по странице в другом месте (document.location = "foo" ) и используйте webView: ShouldLoadRequest: искать этот запрос и возвращать нет, а также запускать то, что вам нужно (и обычно возвращать да).

Ответ 2

После выполнения stringByEvaluatingJavascriptFromString вы можете попробовать выполнить код ниже, чтобы решить вашу проблему.

webView.userInteractionEnabled = NO;
while (webView.loading) {
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
webView.userInteractionEnabled = YES;

Позвольте мне знать, что он работает для вас или нет.

Ответ 3

Как о встраивании функции заглушки для события onclick непосредственно в элемент html. Вы можете привязать элемент html к функции обработчика события onclick позже, когда это будет более подходящим.

<button onclick="function () { };"/>

Ответ 4

stringByEvaluatingJavascriptFromString должен быть выполнен, когда он возвращается. Это может быть сделано в другом потоке (возможно, не потому, что он может изменить пользовательский интерфейс), но метод не может вернуть результат строки, пока он не вернет результат.