2017-01-06 2 views
10

Я заметил, что [UIWebViewDelegate webView:shouldStartLoadWithRequest:navigationType:] вызывается только с традиционными ссылками <a href="...">, а не с одностраничным веб-приложением JavaScript-навигации.Как правильно слушать изменения навигации в UIWebView?

Например, если я перехожу на m.facebook.com в UIWebView и начинаю использовать верхний навигатор (см. Снимок экрана ниже), он никогда не запускает этот метод делегирования.

Причина, по которой я хочу, чтобы метод был подключен, заключается в том, что я хочу добавить кнопки назад и вперед над UIWebView, но мне нужно знать, когда включать/отключать эти кнопки. Есть ли другой метод делегата, который я должен использовать для правильного прослушивания изменений навигации?

Обновление: Следует также отметить, что мобильный Safari корректно обновляет состояние кнопки «Назад/Вперед» на мобильном сайте Facebook, поэтому я надеюсь, что Apple предоставит возможность разработчикам также сделать это.

enter image description here

+0

Вы просмотрели '[UIWebView canGoBack]'? https://developer.apple.com/reference/uikit/uiwebview/1617931-cangoback – SergGr

+0

@SergGr, который не помогает мне, потому что мне нужен крючок, когда есть изменения в навигации, чтобы знать, когда звонить canGoBack –

ответ

5

Похоже, что это просто не поддерживается UIWebViewDelegate, ни WKNavigationDelegate (который я только что протестировал с Facebook). Есть несколько вариантов, перечисленных в this answer:

  1. Javascript инъекции, чтобы сохранить изменения страницы (прочитать на history.pushState).
  2. KVO для просмотра изменений в веб-представлении (например, изменение размера прокрутки)
  3. просмотр изменений названия, как указано выше.
  4. проверка обновлений каждый раз, когда пользователь удаляет вид.

Update

Я также попытался this answer на Facebook, которая предполагает введение JavaScript, чтобы поймать XMLHttpRequests при каждой загрузке новой страницы. Это вид делает то, о чем вы просите, но это немного взломан. Некоторые вкладки facebook не работают должным образом с очень простой реализацией, но вы можете решить эти проблемы.