#ios #objective-c #uiwebview
#iOS #objective-c #uiwebview
Вопрос:
Иногда мы нажимаем на ссылки до полной загрузки страницы. Оказывается, нет надежного способа узнать, по какой ссылке пользователь нажимает. Вы могли бы сказать, что безопасно смотреть на метод делегирования:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
Но, как показали некоторые из моих экспериментов, этот метод вызывается с помощью UIWebViewNavigationTypeLinkClicked более одного раза для одной и той же страницы.
Например, попробуйте записать этот путь:
- Перейдите к google.com .
- Найдите «Нью-Йорк таймс».
- Нажмите на первую ссылку.
На шаге (3) делегат get вызывается 3 раза! с помощью UIWebViewNavigationTypeLinkClicked. Во-первых, когда вы нажимаете на ссылку, чтобы перейти к nytimes.com из Google, а затем еще два раза, пока он загружается. В здравом уме!
Для этого я дошел до крайности. Я переделал весь свой проект в iOS 8, надеясь, что новый WKWebView предоставит решение, но оказалось, что оно работает так же.
Я нашел решение, но я действительно не могу сказать, будет ли оно работать или нет каждый раз, когда пользователь нажимает на ссылку во время загрузки страницы.
Вот оно:
Когда вы нажимаете на ссылку, чтобы перейти на другую страницу, делегат get вызывается с помощью этого метода:
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
Ошибка:
"The operation couldn’t be completed.” (-999)
Последняя ссылка, которую UIWebView загружает перед выдачей ошибки, — это новая ссылка, по которой пользователь нажал. Итак, если вы сохраняете каждую ссылку, загружаемую UIWebView, в переменной с именем lastURL, вы можете использовать lastURL в качестве URL-адреса новой страницы.
Меня беспокоят две вещи:
-
Вызываемый делегат get сообщает об ошибке с небольшой задержкой, позволяя загружать несколько подкадров новой веб-страницы, в результате чего lastURL сохраняет URL-адрес некоторого подкадра новой ссылки, а не фактическую новую ссылку.
-
Ошибка -999 выдается из-за какой-то другой проблемы, а не когда загрузка страницы завершилась неудачно, потому что пользователь нажал на ссылку.
Есть ли более надежный способ? Мне все равно, работает ли ваш способ для iOS 7 или iOS 8.