使用Xcode中的Swift确定webView中的完成加载网站

时间:2015-01-26 11:19:25

标签: ios xcode swift webview loading

我试图在xcode中使用swift创建一个webapp,这是我目前的代码:

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所有定义的文档?我的意思是..(开始/结束加载,当前网址,标题页等)?

(抱歉我的英文)。

2 个答案:

答案 0 :(得分:30)

通过UIWebView委托电话。

您需要将webView delegate设置为当前控制器,并符合UIWebViewDelegate协议。当webView完成加载后,页面func webViewDidFinishLoad(_ webView: UIWebView)将被调用。

答案 1 :(得分:2)

对于WKWebview,还有wknavigationdelegate didfinish,但不会像SO问题 WKWebView didn't finish loading, when didFinishNavigation is called - Bug in WKWebView? answer 那样显示技巧

我还发现当加载的页面非常复杂且非常复杂时,UIWebview的webViewDidFinishLoad(- webView: UIWebView)也无效。

我认为使用native 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")
    }

在此 use angularjs to check element ready ,您还可以重新 how-to-call-a-function-after-a-div-is-ready check-if-a-given-dom-element-is-ready jquery-ready-equivalent-event-listener-on-elements 了解更多信息。