Swift中无法从WKWebView的didFinish代理方法跳转页面求助
问题分析与解决方案
核心原因
你通过present展示的CCAvenuePaymentWebviewVC是模态视图控制器,它独立于原导航栈之外,因此该VC的navigationController属性默认是nil。虽然日志能打印说明逻辑代码已执行,但调用navigationController?.pushViewController时,由于导航控制器不存在,跳转操作无法生效。
解决方案
以下三种方式可解决该问题,你可根据业务需求选择:
方式一:先关闭模态VC,再在原导航栈跳转
在didFinish方法中,先关闭当前模态视图,再通过presentingViewController获取原VC所属的导航控制器执行跳转:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { guard let url = webView.url else { return } if url.absoluteString.contains("指定跳转链接") { print("跳转逻辑触发") // 先关闭模态视图 dismiss(animated: true) { // 获取原VC的导航控制器并跳转 if let navController = self.presentingViewController as? UINavigationController { navController.pushViewController(MyFollowersViewController(), animated: true) } else { self.presentingViewController?.navigationController?.pushViewController(MyFollowersViewController(), animated: true) } } } }
方式二:将模态VC包裹在导航控制器中展示
修改原present代码,把CCAvenuePaymentWebviewVC包裹到UINavigationController中再展示,这样模态VC自身就拥有导航控制器,直接push即可生效:
// 原present代码修改为 let paymentVC = CCAvenuePaymentWebviewVC() let navVC = UINavigationController(rootViewController: paymentVC) // 可按需隐藏导航栏 navVC.navigationBar.isHidden = true present(navVC, animated: true)
之后在didFinish中直接执行跳转:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { guard let url = webView.url else { return } if url.absoluteString.contains("指定跳转链接") { print("跳转逻辑触发") self.navigationController?.pushViewController(MyFollowersViewController(), animated: true) } }
方式三:通过闭包回调让原VC处理跳转
在CCAvenuePaymentWebviewVC中定义闭包,检测到跳转链接时触发闭包,通知原VC执行跳转:
- 在
CCAvenuePaymentWebviewVC中添加闭包:
var onNeedJumpToFollowers: (() -> Void)?
- 在
didFinish中调用闭包:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { guard let url = webView.url else { return } if url.absoluteString.contains("指定跳转链接") { print("跳转逻辑触发") dismiss(animated: true) { self.onNeedJumpToFollowers?() } } }
- 原present页面设置闭包:
let paymentVC = CCAvenuePaymentWebviewVC() paymentVC.onNeedJumpToFollowers = { self.navigationController?.pushViewController(MyFollowersViewController(), animated: true) } present(paymentVC, animated: true)
内容的提问来源于stack exchange,提问作者Swift
相关产品推荐
相关产品推荐

