Определить, как завершить загрузку веб-сайта в webView с помощью Swift в Xcode
Я пытаюсь создать webapp с быстрым в xcode, это мой текущий код:
IBOutlet var webView: UIWebView!
var theBool: Bool = false
var myTimer = NSTimer()
@IBOutlet var progressBar: UIProgressView!
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: "http://stackoverflow.com")
let request = NSURLRequest(URL: url)
webView.loadRequest(request)
}
У меня вопрос: как определить окончательную загрузку страницы в webView?
Знаете ли вы документацию, содержащую все определения WebView? Я имею в виду.. (начальная/конечная нагрузка, текущий url, титульная страница и т.д.)?
(Извините за мой английский).
Ответы
Ответ 1
Через вызов делегата UIWebView
.
Вам нужно настроить ваш webViews delegate
на текущий контроллер и соответствовать протоколу UIWebViewDelegate
. Когда webView завершит загрузку, страница func webViewDidFinishLoad(_ webView: UIWebView)
будет вызвана.
Ответ 2
Для WKWebview существует также wknavigationdelegate didfinish, но не выполняет трюк как вопрос SO WKWebView не завершил загрузку, когда вызывается функция "УдалитьFinishNavigation" - ошибка в WKWebView?, и этот ответ показать.
Я также обнаружил, что загружаемая страница очень сложна и динамична, UIWebview webViewDidFinishLoad(- webView: UIWebView)
также не работает.
И я считаю, что использовать native swift или objective-c для обнаружения при загрузке страницы - это плохой выбор. Более гибкий и эффективный способ - использовать javascript для вызова собственного быстрого кода при загрузке страницы. Что еще это работает для конкретного доминирования, заканчивающего событие загрузки и очень динамичного контента.
Для того, чтобы быстро вызвать javascript, обратитесь к этому сообщению .
Вот пример кода для динамического содержимого с ангулярными символами.
JS,
var homeApp = angular.module('home', ['ui.bootstrap', 'ngAnimate']);
homeApp
.directive("printerinfo",
function() {
return {
restrict: "E",
link: function() { //call navite swift when page finishing loading
try {
window.webkit.messageHandlers.testHandler.postMessage("Hello from JavaScript");
} catch(err) {
console.log('The native context does not exist yet');
}
},
templateUrl: "/static/tpls/cloud/app/printerinfo.php",
}
})
swift3,
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.name)
if(message.name == "testHandler") {
//webpage content loaded
print(Date())
print("javascript test call swift")
}
Здесь я используйте angularjs для проверки готового элемента, вы также можете переписать или check-if-a-given-dom -element-ready или jquery-ready-equal-event-listener-on-elements для больше.