Загрузка страниц
Поскольку пользователь перешел от страницы до страницы в Вашем встроенном браузере, можно хотеть вывести на экран текущий URL, состояние загрузки и сообщения об ошибках. Например, в приложении веб-браузера, Вы могли бы хотеть вывести на экран текущий URL в текстовом поле, которое может отредактировать пользователь.
Последовательность делегата загрузки кадра сообщения
Поскольку веб-страница проходит через процесс загрузки, WebKit отправляет ряд сообщений делегату загрузки кадра. Точная последовательность зависит от содержания страницы. Ссылка на протокол SinceWebFrameLoadDelegate является неофициальным протоколом, который сообщение не отправляется делегату, если это не реагирует на него. Например, последовательность сообщений для простой страницы, содержащей заголовок и загрузки успешно, могла бы быть:
webView:didStartProvisionalLoadForFrame:
— вызванный в начале загрузки.webView:willCloseFrame:
— вызванный, когда веб-представление сделано со старыми объектами кадра (передал как параметр) непосредственно перед тем, как они очищены из памяти.webView:didCommitLoadForFrame:
— вызванный, когда источник данных переходы от временного до зафиксированного.webView:didReceiveTitle:forFrame:
— вызванный, когда заголовок кадра поступил, который является в любое время после того, как источник данных фиксируется и прежде чем будет закончена загрузка. Этот метод может быть вызван многократно.webView:didFinishLoadForFrame:
— вызванный, когда все данные поступили для источника данных
Главным образом Вы реализуете вышеупомянутые методы делегата вывести на экран информацию о состоянии загрузки и веб-странице. Вы могли бы реализовать webView:willCloseFrame:
если Ваше приложение поддерживает ссылки на содержание предыдущей страницы.
Однако загрузка страницы является сложным процессом, таким образом, необходимо ожидать, что некоторые клиентские запросы перестанут работать. Поскольку клиентский запрос является асинхронным по сети, новая страница может сразу не загрузиться, и ошибки могут произойти при загрузке. Как правило, реализация по умолчанию ничего не делает (выводит на экран пустое представление), если происходит ошибка; поэтому, Ваше приложение может хотеть вывести на экран сообщения об ошибках вместо этого. Эти методы делегата могут быть реализованы для обработки ошибок:
webView:didFailProvisionalLoadWithError:forFrame:
вызывается, когда ошибка произошла, прежде чем любые данные были получены. Обычно вызванный, если URL плох или сети не удалось поставить запрос.webView:didFailLoadWithError:forFrame:
когда переданному источнику данных не удается загрузиться, вызывается.
Сообщения будут также отправлены делегату, если содержание страницы будет содержать перенаправления сервера, или позиция прокрутки в кадре изменяется (это может произойти, когда пользователь щелкает по привязке в кадре). Дополнительную информацию см. в Ссылке на протокол WebFrameLoadDelegate на этих и других методах делегата.
Тестирование на основной кадр
Если расположение изменяется для какого-либо кадра в иерархии WebFrame, делегат загрузки кадра уведомляется. Обычно, Вы обновляете дисплей только для изменений в основном кадре. По этой причине Ваш код должен всегда тестировать, чтобы видеть, является ли веб-кадр, переданный как параметр методу делегата, основным кадром, как в этом примере:
// Only report feedback for the main frame. |
if (frame == [sender mainFrame]){ |
[... |
} |
Отображение текущего URL
Каждый раз, когда пользователь нажимает на ссылку в веб-странице, изменения URL и новая страница загружается. По умолчанию Ваше приложение не уведомляется относительно этого изменения. Если Вы хотите отслеживать текущую страницу, необходимо реализовать некоторые методы делегата, в частности делегат загрузки кадра к объекту веб-представления. Поскольку WebFrameLoadDelegate является неофициальным протоколом, необходимо реализовать только методы делегата, которые Вы хотите.
Например, пользователь щелкает по ссылке, и Вы хотите обновить текстовое поле для отображения текущего URL. Вы делаете это путем реализации webView:didStartProvisionalLoadForFrame:
метод делегата как в этом примере:
- (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame |
{ |
// Only report feedback for the main frame. |
if (frame == [sender mainFrame]){ |
NSString *url = [[[[frame provisionalDataSource] request] URL] absoluteString]; |
[textField setStringValue:url]; |
} |
} |
Отображение названия страницы
Если Вы хотите вывести на экран название страницы, реализуйте webView:didReceiveTitle:forFrame:
метод делегата. Например, можно вывести на экран название страницы на окне, как в этом примере:
- (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame |
{ |
// Report feedback only for the main frame. |
if (frame == [sender mainFrame]){ |
[[sender window] setTitle:title]; |
} |
} |
Точно так же можно реализовать webView:didReceiveIcon:forFrame:
метод делегата, если Вы хотите вывести на экран значок страницы.
Отображение состояния загрузки
Помимо реализации webView:didStartProvisionalLoadForFrame:
метод для отображения названия страницы можно также использовать его для отображения состояния, например, «Загружаясь». Помните, что в этой точке содержание только требовали, не загрузили; поэтому, источник данных является временным.
Точно так же реализуйте webView:didFinishLoadForFrame:
, webView:didFailProvisionalLoadWithError:forFrame:
и webView:didFailLoadWithError:forFrame:
методы делегата получить уведомление, когда страница была загружена успешно или неуспешно. Если бы ошибка произошла, Вы могли бы хотеть вывести на экран сообщение.