WKWebView GoBack выводит меня на вершину локальной html-страницы

#ios #objective-c #wkwebview

#iOS #objective-c #wkwebview

Вопрос:

У меня есть несколько HTML-страниц в качестве справки в приложении, и я использую WKWebView для их отображения, который включает в себя вызов кнопки «назад» goBack .

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

Я удалил все лишнее для отладки, например, для навигации по почте и т. Д., Поэтому в настоящее время я просто звоню в:

 [webView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"help" withExtension:@"html"]]];
 

Затем просто [webView goBack] и обратно к началу страницы, на которую вы переходите. Не имеет значения, переходите ли вы по ссылке на другой внутренний html или на внешнюю страницу. Но, как я уже сказал, если вы перейдете по ссылке на внешнюю страницу, а затем на другую внешнюю страницу, первая обратная страница приведет вас к правильной позиции первой внешней страницы.

Есть идеи? Это делает просмотр внутреннего html раздражающим.

Редактировать: хорошо, это может быть связано с фактическим HTML — есть одна страница, на которой работает back, пытаясь выяснить разницу. Все перед <body> тем, как то же самое, и все страницы проходят w3.org переходная проверка html4.

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

1. var backForwardList: WKBackForwardList { get } WKWebView должен помочь вам узнать текущий стек страниц, на которые вы можете переходить вперед и назад, и выяснить, какая страница отсутствует в списке.

2. @dispatchMain Речь идет не о пропавшей странице. Он возвращает вас на правильную страницу, но не в правильном положении прокрутки, а только в верхней части страницы.

Ответ №1:

Вот предварительный ответ, я был бы признателен, если кто-нибудь сможет улучшить его или объяснить механику. Кажется, что «GoBack» выводит вас на начало предыдущей страницы, если на этой странице есть элемент в ее содержимом, ширина которого больше исходной ширины, в которую webview пытался передать содержимое. Например, в моем случае, поскольку я использую шрифты динамического типа, для некоторых размеров текста некоторые заголовки и некоторые ссылки были слишком длинными. Немедленное решение — добавить body {word-wrap:break-word;} . Это немного «молотобойное» решение, поскольку оно имеет некоторые непреднамеренные последствия, поэтому я пытаюсь найти альтернативу (в настоящее время играю с viewport meta на случай, если это может помочь).

Я не нашел способа исправить goBack поведение для loadHTMLString — когда я пытаюсь сначала записать строку в файл, goBack это работает, но у меня есть другие проблемы (больше не могу переходить по ссылкам на html-файлы в моем пакете).