第三级Segue中self.dismiss无响应问题求助
问题分析与解决方案
嘿,我太懂你这种困惑了!其实核心问题出在你搞混了两种视图控制器跳转方式对应的返回逻辑——show segue和dismiss根本不搭边儿!
为什么self.dismiss没用?
你用的show segue本质是把目标控制器push到导航控制器的栈里,这种属于导航层级的递进跳转;而self.dismiss(animated:completion:)是专门用来关闭通过**模态方式(present)**弹出的控制器的,这俩完全是两个不同的跳转体系,所以你调用dismiss自然毫无反应,完成块也不会执行。
正确的返回姿势
既然是通过导航栈push进来的,就得用导航栈的返回方法:
- 如果只想回到上一个视图控制器,在TableViewController的行点击方法里写:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { navigationController?.popViewController(animated: true) }
- 如果想直接跳转到导航栈的根控制器(最开始的那个视图控制器),就用:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { navigationController?.popToRootViewController(animated: true) }
额外补充导航控制器的核心规则
- 当你用
showsegue跳转时,系统会自动把目标控制器加入当前导航栈的顶部,导航栏默认的返回按钮就是调用popViewController方法,所以其实你不写代码,默认返回按钮也能正常工作; - 只有当你用
present方式弹出控制器时(比如用present modallysegue),才需要用dismiss来关闭它。
内容的提问来源于stack exchange,提问作者Todd Cormack
相关产品推荐
相关产品推荐

