You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:59:12