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

