web-dev-qa-db-ja.com

XcodeでSwift

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、タイトルページなど..)?

(私の英語はごめんなさい)。

12
Mirko Brombin

UIWebViewデリゲート呼び出しを介して。

WebViews delegateを現在のコントローラーに設定し、UIWebViewDelegateプロトコルに準拠する必要があります。 webViewがページの読み込みを完了すると、func webViewDidFinishLoad(_ webView: UIWebView)が呼び出されます。

30
Marius Fanu

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詳細については。

2
Kris Roofe