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

Swift 4应用前台展示视图控制器无法关闭及验证后返回原控制器问题

解决Swift 4中前台弹出密码验证控制器的关闭与返回问题

刚好碰到过类似的场景,给你梳理下这两个问题的解决方案:

问题1:关闭密码验证控制器

在你的PassC_VC里,当用户完成密码验证并通过后,直接调用系统的 dismiss 方法就能关闭这个控制器:

// 在PassC_VC的密码验证成功回调中添加
self.dismiss(animated: true, completion: {
    // 这里可以追加验证成功后的额外操作,比如刷新页面数据等
})

执行这段代码后,密码验证控制器就会平滑关闭啦。

问题2:验证后回到之前打开的视图控制器

你原来的代码可能存在一个小问题:如果直接用根控制器去present密码验证控制器,会跳过当前正在显示的控制器,导致dismiss后直接回到根页面。正确的做法是先找到当前应用最顶层的视图控制器,再在它上面弹出密码验证控制器,这样验证完成dismiss后就会回到之前打开的那个页面。

修改后的applicationWillEnterForeground代码可以这样写:

func applicationWillEnterForeground(_ application: UIApplication) {
    let stb = UIStoryboard(name: "Main", bundle: nil)
    let ps = stb.instantiateViewController(withIdentifier: "psID") as! PassC_VC
    
    // 获取当前最顶层的视图控制器
    guard let topVC = getTopViewController() else { return }
    topVC.present(ps, animated: true, completion: nil)
}

// 新增辅助方法:获取当前应用的顶层视图控制器
private func getTopViewController() -> UIViewController? {
    var topVC = UIApplication.shared.keyWindow?.rootViewController
    while let presentedVC = topVC?.presentedViewController {
        topVC = presentedVC
    }
    return topVC
}

这个辅助方法会一层层遍历找到当前正在显示的最顶层控制器,在它上面弹出密码验证控制器后,验证成功关闭时自然就回到原来的页面了。另外不管你的根控制器是UINavigationController还是UITabBarController,这个方法都能正确识别到当前活跃的子控制器,不用担心适配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:15:43