webkit - слушатель перестает работать при загрузке второй страницы - PullRequest
2 голосов
/ 13 февраля 2011

У меня есть клиентское приложение Mac, написанное на Objective-C, которое представляет пользователю список HTML-документов в таблице, и когда пользователь щелкает строку, он загружает выбранную HTML-страницу в WebView.

У каждой HTML-страницы есть прослушиватель «click», который вызывает метод Objective-C.

Когда приложение запускается и пользователь нажимает на первую строку, все работает нормально.Событие "click" перехвачено, и мой метод Objective C успешно вызван.

Однако, когда пользователь нажимает на вторую (или последующую) запись, а затем в нее загружается новая HTML-страницаWebView прослушиватель при «щелчке» никогда не срабатывает.

Если выбранная запись загружается первой, она всегда работает нормально, поэтому проблема не в одном из плохих HTML-файлов.К вашему сведению, все файлы в основном идентичны.

Я выкинул проблему в простом тестовом приложении.Его можно скачать здесь - http://dl.dropbox.com/u/160638/Work/TCL/MapTest2.zip

ПРИМЕЧАНИЕ. Тестовое приложение выводит сообщение в стандартный журнал, поэтому вам нужно проверить окно журнала в Xcode или Console.app, чтобы увидеть Objective-Cвызов метода работает (или нет).Кнопки вверху расположены попарно, сначала загружаются из локального файла, затем из HTML-страницы в виде строки, а затем извлекают HTML-страницу с веб-сайта.

В результате расширенного поиска, я предполагаю, что когда язагрузить вторую HTML-страницу в WebView, предыдущая страница каким-то образом сохраняется, и два слушателя при «щелчке» конфликтуют каким-то образом?Это возможно?

Кто-нибудь может порекомендовать способ загрузки HTML-страниц таким образом, чтобы сработали последующие загрузки?Есть ли способ гарантировать, что все страницы, ранее загруженные в WebView, будут полностью выгружены до того, как я загрузлю вторую страницу?

Буду признателен за любые предложения, которые вы можете сделать.

С уважением

Даррен.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2011

Проблема в том, что windowScriptObject уникален для каждого HTML-документа. Вам необходимо выполнить

[[[self mapView] windowScriptObject] setValue:self forKey:@"AppDelegate"]; 

каждый раз, когда HTML загружается. Также обратите внимание, что windowScriptObject не сразу доступен после вызова loadHTMLString:baseURL:. Это делается только тогда, когда HTML готов. Итак, делаем

[[[self mapView] mainFrame] loadHTMLString:htmlString baseURL:nil]; 
[[[self mapView] windowScriptObject] setValue:self forKey:@"AppDelegate"]; 

не решит проблему. Скорее, вы должны установить windowScriptObject в некотором методе делегата представления после завершения загрузки.

Теперь дайте мне часть вашей зарплаты. (Шучу: р)

1 голос
/ 14 февраля 2011

Спасибо Юджи за правильный ответ.

Метод делегата:

 -webView:didClearWindowObject:forFrame:

Например:

 - (void) webView:(WebView *)sender  
          didClearWindowObject:(WebScriptObject *)windowObject  
          forFrame:(WebFrame *)frame  
 {  
           [windowObject setValue:self forKey:@"AppDelegate"];  
 }

Этот пример был любезно предоставлен мне другим постером в другом месте, поэтому спасибо ему тоже.

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