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

在Xcode/Swift中实现WKWebView链接跳转至含按钮的新ViewController

当然可行!这是iOS开发中很常见的需求,我来给你一步步拆解实现方法

核心思路

通过WKNavigationDelegate拦截原WKWebView中的链接点击事件,跳转到你自定义的包含WKWebView和按钮的新ViewController,同时取消原WebView的默认跳转行为。

具体实现步骤

1. 给原WebViewController设置导航代理,拦截链接

首先在承载初始WKWebView的ViewController中,实现WKNavigationDelegate的decidePolicyFor方法,捕获用户点击的链接:

import UIKit
import WebKit

class OriginalWebVC: UIViewController, WKNavigationDelegate {
    private var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupWebView()
    }

    private func setupWebView() {
        // 初始化WKWebView并添加到视图
        webView = WKWebView(frame: view.bounds)
        webView.navigationDelegate = self
        view.addSubview(webView)

        // 加载初始页面(替换成你的目标URL)
        if let url = URL(string: "https://your-initial-url.com") {
            webView.load(URLRequest(url: url))
        }
    }

    // 拦截链接跳转事件
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        // 只处理用户主动点击的链接(排除页面自动跳转等情况)
        guard navigationAction.navigationType == .linkActivated, let targetURL = navigationAction.request.url else {
            // 其他情况允许默认跳转
            decisionHandler(.allow)
            return
        }

        // 实例化自定义的新ViewController
        let customWebVC = CustomWebViewController()
        customWebVC.targetURL = targetURL

        // 跳转到新页面(如果当前VC在导航栈中用push,否则用present)
        if let navController = navigationController {
            navController.pushViewController(customWebVC, animated: true)
        } else {
            present(customWebVC, animated: true)
        }

        // 取消原WebView的默认跳转
        decisionHandler(.cancel)
    }
}

2. 创建带按钮的自定义WebViewController

接下来创建你的目标ViewController,里面包含WKWebView和需要的按钮(比如返回、刷新按钮):

import UIKit
import WebKit

class CustomWebViewController: UIViewController, WKNavigationDelegate {
    // 接收传递过来的目标URL
    var targetURL: URL!
    private var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        loadTargetURL()
    }

    private func setupUI() {
        view.backgroundColor = .white

        // 添加自定义按钮到导航栏
        let backBtn = UIBarButtonItem(title: "返回", style: .plain, target: self, action: #selector(backButtonTapped))
        let refreshBtn = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(refreshButtonTapped))
        navigationItem.leftBarButtonItem = backBtn
        navigationItem.rightBarButtonItem = refreshBtn

        // 初始化WKWebView
        webView = WKWebView(frame: view.bounds)
        webView.navigationDelegate = self
        view.addSubview(webView)
    }

    private func loadTargetURL() {
        webView.load(URLRequest(url: targetURL))
    }

    // 返回按钮点击事件
    @objc private func backButtonTapped() {
        if navigationController != nil {
            navigationController?.popViewController(animated: true)
        } else {
            dismiss(animated: true)
        }
    }

    // 刷新按钮点击事件
    @objc private func refreshButtonTapped() {
        webView.reload()
    }
}

一些注意事项

  • 如果你的原ViewController不在导航控制器栈中,记得把pushViewController换成present来展示新页面。
  • 可以根据需求添加更多按钮(比如分享、前进按钮),或者自定义按钮的样式和位置。
  • 若需要过滤特定域名的链接(比如只让内部域名在新页面打开),可以在拦截方法里增加URL判断逻辑:
    if targetURL.host == "your-target-domain.com" {
        // 跳转到新页面
    } else {
        decisionHandler(.allow) // 其他域名允许默认跳转
    }
    
  • 若加载HTTP协议的URL,需要在Info.plist中配置NSAppTransportSecurity的例外规则(苹果推荐优先使用HTTPS)。

这样就能完美实现你的需求啦!如果还有细节需要调整,都可以根据自己的业务场景灵活修改~

内容的提问来源于stack exchange,提问作者Frederik Chalmer Rasmussen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:03:33