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

