如何在Cocoa中获取WKWebView当前URL并更新NSTextField
解决WKWebView跳转时自动更新地址栏的问题
嘿,我来帮你搞定这个问题!你说得没错,要实现点击网页链接跳转后自动更新地址栏的NSTextField,确实得靠WKWebView的代理机制来实现。咱们一步步来修改你的代码:
步骤1:让ViewController遵守WKNavigationDelegate协议
首先,给你的ViewController添加上协议遵守,这样才能接收网页导航的回调事件:
class ViewController: NSViewController, WKNavigationDelegate {
步骤2:设置WebView的代理
在viewDidLoad方法里,把webview的navigationDelegate设置为当前ViewController,这样代理方法才能被触发:
override func viewDidLoad() { super.viewDidLoad() // 新增这行,绑定代理 webview.navigationDelegate = self let initialurl = "https://google.com" if let url = URL(string: initialurl) { let request = URLRequest(url: url) webview.load(request) desiredWebsite.stringValue = initialurl } }
步骤3:实现代理方法更新地址栏
添加WKNavigationDelegate的didFinish方法,这个方法会在页面加载完成(包括点击链接跳转后的新页面)时被调用,咱们在这里更新地址栏:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { if let currentURL = webView.url?.absoluteString { desiredWebsite.stringValue = currentURL } }
顺便修正你的goBack按钮逻辑
你原来的goBackOnTouch方法有问题,不能加载空URL,应该直接调用webview的goBack()方法,这才是正确的后退逻辑:
@IBAction func goBackOnTouch(_ sender: Any) { if webview.canGoBack { webview.goBack() // 后退后地址栏会由上面的代理方法自动更新,不用手动设置 } }
完整修改后的代码
import Cocoa import WebKit class ViewController: NSViewController, WKNavigationDelegate { // 新增协议遵守 @IBOutlet weak var webview: WKWebView! @IBOutlet var desiredWebsite: NSTextField! @IBOutlet var goBackButton: NSButton! @IBOutlet var goHomeButton: NSButton! @IBOutlet var goForwardButton: NSButton! override func viewDidLoad() { super.viewDidLoad() webview.navigationDelegate = self // 设置代理 let initialurl = "https://google.com" if let url = URL(string: initialurl) { let request = URLRequest(url: url) webview.load(request) desiredWebsite.stringValue = initialurl } } @IBAction func desiredWebsiteOnTouch(_ sender: Any) { let gotoweb = desiredWebsite.stringValue if let url = URL(string: gotoweb) { let request = URLRequest(url: url) webview.load(request) desiredWebsite.stringValue = gotoweb } } @IBAction func goHomeOnTouch(_ sender: Any) { let gotohome = "https://google.com" if let url = URL(string: gotohome) { let request = URLRequest(url: url) webview.load(request) desiredWebsite.stringValue = gotohome } } @IBAction func goBackOnTouch(_ sender: Any) { if webview.canGoBack { webview.goBack() } } // 新增代理方法,自动更新地址栏 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { if let currentURL = webView.url?.absoluteString { desiredWebsite.stringValue = currentURL } } override var representedObject: Any? { didSet { } } }
简单解释一下原理
WKNavigationDelegate是WKWebView的导航代理,它提供了一系列方法来监听页面的加载、跳转等事件。didFinish方法会在页面完全加载完成后触发,不管是初始加载还是点击链接跳转后的页面加载,都会调用这个方法。- 在这个方法里,我们获取当前webview的URL,然后赋值给desiredWebsite的stringValue,就能实现地址栏自动更新的效果了。
内容的提问来源于stack exchange,提问作者Larson Carter
相关产品推荐
相关产品推荐

