#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-файлы в моем пакете).