Swift:切换TabbarController标签时保留已实例化的UIViewController
关于TabBarController切换时VC实例重复创建的问题解决
首先,咱们先搞清楚你的VC1是不是真的被重新实例化了——最简单的验证方法就是在VC1里加个唯一标识,比如用UUID,然后在初始化方法和viewWillAppear里打印这个ID。要是每次切回来ID都不一样,那确实是每次都新建了实例。
比如在VC1里加这段代码:
var vcIdentifier = UUID() override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) print("VC1 初始化,ID: \(vcIdentifier)") } required init?(coder: NSCoder) { super.init(coder: coder) print("VC1 从Storyboard加载,ID: \(vcIdentifier)") } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) print("VC1 即将显示,ID: \(vcIdentifier)") }
接下来分析为啥会出现这种情况:TabBarController默认是会保留所有子VC实例的,切换时只是做显示/隐藏操作。大概率是你的配置出了问题,比如:
- 手动创建TabBarController时,每次切换tab都重新
new了VC实例 - 用了
tabBarController(_:viewControllerFor:)代理方法,但每次都返回新的VC - Storyboard里的关联方式不对,比如用了segue来跳转tab,导致每次都创建新VC
怎么解决?
方法一:提前创建并缓存所有子VC
如果是代码创建TabBarController,一定要提前把所有子VC实例都创建好,然后一次性赋值给viewControllers,不要每次切换才创建:
// 可以在AppDelegate或者TabBarController的初始化里做这件事 let homeVC = VC1() let profileVC = VC2() // 如果有第三个VC同理 let tabBarController = UITabBarController() tabBarController.viewControllers = [homeVC, profileVC]
这样TabBarController会一直持有这些VC的引用,切换时就不会重新实例化了。
方法二:修复代理方法(如果用了的话)
要是你实现了TabBarController的代理方法来提供VC,那一定要缓存好实例,不要每次都新建:
class MyTabBarController: UITabBarController, UITabBarControllerDelegate { private var cachedVCs: [UIViewController] = [] override func viewDidLoad() { super.viewDidLoad() delegate = self // 提前创建所有子VC并缓存 cachedVCs = [VC1(), VC2()] } func tabBarController(_ tabBarController: UITabBarController, viewControllerFor index: Int) -> UIViewController? { return cachedVCs[index] } }
方法三:检查Storyboard配置
如果是用Storyboard做的,确保TabBarController的子VC是直接拖进去关联的,不要用push或者present的segue来连接tab。直接把VC拖到TabBarController的子控制器列表里,这样Storyboard会自动帮你保留实例。
查找资料的关键词推荐
你搜这些关键词就能找到更多相关解决方案:
UITabBarController retain view controller instanceiOS tab bar reinitializes view controlleriOS 切换Tab不重建ViewControllerUITabBarController keep child VC alive
内容的提问来源于stack exchange,提问作者Dong Manh
相关产品推荐
相关产品推荐

