2017-01-30 56 views
1

私はjavascriptコールバックを待つことを試みていますが、javascriptコールバックの前にswiftコールバックが呼び出されています。 JSコールバックをどのように待つことができますか?evaluateJavaScriptの後にJSコールバックを待つ

AppWebView.evaluateJavaScript("$('.loading-gif').removeClass('hide', function() { return true });") { (Any, Error) in 
\\ .loading-gif successfully hided. 
} 

答えて

2

evaluateJavaScriptを使用してこれを行う方法はありません。評価されたJavascriptが返されるとすぐにコールバックが呼び出されるからです。これは、非同期呼び出しが行われる前である可能性が最も高いです。

あなたに似た、あなたのSWIFTコード内でメッセージハンドラを登録する必要があります

...

let script = WKUserScript(source: javascriptString, 
          injectionTime: injectionTime, 
          forMainFrameOnly: true) 
userContentController.addUserScript(script) 
webView.configuration.userContentController.addScriptMessageHandler(self, 
              name: "didShowLoading") 

次に、あなたのスウィフトコード内のデリゲートメソッドを定義することができます...最後に

func userContentController(userContentController: WKUserContentController, 
    didReceiveScriptMessage message: WKScriptMessage) { 

    if message.name == "didShowLoading" { 
     // do something 
    } 
} 

、あなたが投稿することができますあなたのjavascriptコードからのメッセージ...

var script = "$('.loading-gif').removeClass('hide', function() {" 
      + " webkit.messageHandlers['didShowLoading'].postMessage('');" 
      + "});" 
webView.evaluateJavaScript(script) 
+0

'javascriptString'と' scrip t'(下のスニペットで)? – crewshin

2

あなたはJS側でhttps://github.com/marcuswestin/WebViewJavascriptBridge

このライブラリを使用することができます:あなたは、コールバックを経由してネイティブのiOSコードを通知することもでき

self.bridge.callHandler("show_loading",data:nil, handler: { (data:AnyObject!) in 
      //do whatever you want... 
     }) 
2

bridge.registerHandler("show_loading", function(data, responseCallback) { 
    $('.loading-gif').removeClass('hide', function() { 
    responseCallback(true) 
    }); 
}) 

そしてスウィフト側JavaScriptのコールバックから。あなたはJavaScriptにこのような何かを追加する場合:

window.webkit.messageHandlers.observe.postMessage(JSON.stringify({ callback: 'show_loading' } ));

を次にネイティブ側の設定(WKWebViewConfigurationにインストールされている)あなたのWKWebViewためWKUserContentControllerに。 userContentController.didReceiveScriptMessageハンドラは、Javascript側から送信されたJSONで呼び出されます。

関連する問題