在 Xcode 中用 Swift 确定在 webView 中完成加载网站
Determinate finish loading website in webView with Swift in Xcode
我正在尝试在 xcode 中使用 swift 创建一个网络应用程序,这是我当前的代码:
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://whosebug.com")
let request = NSURLRequest(URL: url)
webView.loadRequest(request)
}
我有一个问题,如何确定网页在 webView 中的加载完成?
您知道包含 WebView 所有定义的文档吗?我的意思是 ..(开始/结束加载、当前 url、扉页等 ..)?
(对不起我的英语)。
通过 UIWebView
委托调用。
您需要将您的 webViews delegate
设置为当前控制器,并符合 UIWebViewDelegate
协议。当 webView 完成加载页面时 func webViewDidFinishLoad(_ webView: UIWebView)
将被调用。
对于WKWebview还有wknavigationdelegate didfinish, but not do the trick as the SO question and this 显示。
我还发现当要加载的页面非常复杂和动态时,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")
}
这里我use angularjs to check element ready, you can also refter how-to-call-a-function-after-a-div-is-ready or check-if-a-given-dom-element-is-ready or jquery-ready-equivalent-event-listener-on-elements了解更多。
我正在尝试在 xcode 中使用 swift 创建一个网络应用程序,这是我当前的代码:
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://whosebug.com")
let request = NSURLRequest(URL: url)
webView.loadRequest(request)
}
我有一个问题,如何确定网页在 webView 中的加载完成?
您知道包含 WebView 所有定义的文档吗?我的意思是 ..(开始/结束加载、当前 url、扉页等 ..)?
(对不起我的英语)。
通过 UIWebView
委托调用。
您需要将您的 webViews delegate
设置为当前控制器,并符合 UIWebViewDelegate
协议。当 webView 完成加载页面时 func webViewDidFinishLoad(_ webView: UIWebView)
将被调用。
对于WKWebview还有wknavigationdelegate didfinish, but not do the trick as the SO question
我还发现当要加载的页面非常复杂和动态时,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")
}
这里我use angularjs to check element ready, you can also refter how-to-call-a-function-after-a-div-is-ready or check-if-a-given-dom-element-is-ready or jquery-ready-equivalent-event-listener-on-elements了解更多。