xcodeでSwiftを使用してWebアプリを作成しようとしています。これが現在のコードです:
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、タイトルページなど..)?
(私の英語はごめんなさい)。
UIWebView
デリゲート呼び出しを介して。
WebViews delegate
を現在のコントローラーに設定し、UIWebViewDelegate
プロトコルに準拠する必要があります。 webViewがページの読み込みを完了すると、func webViewDidFinishLoad(_ webView: UIWebView)
が呼び出されます。
WKWebviewには wknavigationdelegate didfinish もありますが、SO質問WKWebViewはしませんでした)のようにトリックを実行しないでくださいdidFinishNavigationが呼び出されたときにロードを終了します-WKWebViewのバグ?およびこれ回答 公演。
また、ロードするページが非常に複雑で動的な場合、UIWebviewのwebViewDidFinishLoad(- webView: UIWebView)
も機能しないことがわかりました。
そして、ネイティブSwiftまたはobjective-cを使用して、ページがロードされたことを検出するのは悪い選択だと思います。より柔軟で効果的な方法は、javascriptを使用してネイティブSwiftページの読み込み終了時のコード。さらに、これは特定のdom終了読み込みイベントおよび非常に動的なコンテンツでも機能します。
JavascriptからSwiftを呼び出す方法については、これを参照してください post 。
Anjularjsを使用した動的コンテンツのサンプルコードを次に示します。
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を使用して要素の準備ができていることを確認します、refterhow-to-call-a-function-after-a-div-is-readyまたはcheck-if- a-given-dom-element-is-readyまたはjquery-ready-equivalent-event-listener-on-elements詳細については。