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

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执行跳转:

  1. 在CCAvenuePaymentWebviewVC中添加闭包:
var onNeedJumpToFollowers: (() -> Void)?
  1. 在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?()
        }
    }
}
  1. 原present页面设置闭包:
let paymentVC = CCAvenuePaymentWebviewVC()
paymentVC.onNeedJumpToFollowers = {
    self.navigationController?.pushViewController(MyFollowersViewController(), animated: true)
}
present(paymentVC, animated: true)

内容的提问来源于stack exchange,提问作者Swift

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:57:45