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

iOS(Xcode)问题:关闭第二个控制器时XIB页面与控制器一同被关闭

解决关闭第二个视图控制器时同时关闭两个页面的问题

我明白你遇到的麻烦了——当关闭第二个视图控制器时,原本的XIB页面也跟着一起被关闭了,这完全不是预期的效果。结合你描述的场景,我来帮你梳理下常见的问题原因和对应的解决办法:

一、排查页面跳转与关闭的方式是否正确

这是最容易踩坑的点,不同的跳转方式对应的关闭逻辑完全不同:

  • 如果是用导航控制器push跳转第二个控制器
    关闭时你应该调用popViewController方法,而不是dismiss或者其他会影响根控制器的操作。如果错误调用了dismiss,可能会把整个导航控制器都关掉,连带第一个页面一起消失。
    正确的关闭代码示例:

    @IBAction func closeBtnTapped(_ sender: UIButton) {
        // 只弹出当前的第二个控制器,回到第一个页面
        navigationController?.popViewController(animated: true)
    }
    
  • 如果是用present方式弹出第二个控制器
    关闭时需要在第二个控制器内部调用dismiss方法,这个方法只会关闭当前被弹出的控制器,不会影响原本的XIB页面。
    正确的关闭代码示例:

    @IBAction func closeBtnTapped(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }
    

二、检查第一个XIB页面的控制器是否被正确持有

有时候第一个页面的控制器没有被强引用持有(比如没有作为导航控制器的根控制器,或者window的rootViewController),当第二个控制器关闭时,第一个控制器的引用计数归0,被系统释放,看起来像是被“关闭”了。

  • 你可以检查第一个控制器的初始化和持有逻辑:确保它是被导航控制器、tabBar控制器或者window强引用的,比如在AppDelegate或者SceneDelegate里设置它为rootViewController。

三、排查是否误操作替换了根控制器

如果在跳转第二个控制器时,你错误地把window的rootViewController换成了第二个控制器,那关闭第二个控制器时,整个window的根控制器被移除,自然会导致第一个页面也消失。

  • 检查跳转第二个控制器的代码,确保没有类似UIApplication.shared.keyWindow?.rootViewController = secondVC这样的操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:39:57