在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
相关产品推荐
相关产品推荐

