如何将CoreData的NSPersistentContainer从UITabBarController传递到子视图控制器
问题根源
UITabBarController 关联的子视图控制器(包括你的FavVC)是在TabBarController初始化时就直接加载到自身的viewControllers数组中的,不会触发prepare(for:sender:)方法,这个方法仅适用于Segue驱动的转场场景(比如push、模态弹出),所以你写的赋值逻辑从来没有执行过,才会导致FavVC的container一直为nil。
修复方案
方案:在TabBarController的生命周期方法中直接遍历子控制器赋值
删掉原有的prepare(for:sender:)方法,在TabBar的viewDidLoad里新增遍历赋值逻辑即可:
class TabBar:UITabBarController { var container: NSPersistentContainer! @IBOutlet weak var TabBarContent: UITabBar! override func viewDidLoad() { super.viewDidLoad() guard container != nil else { fatalError("This view needs a persistent container.") } print("it works!") // 新增赋值逻辑 for vc in viewControllers ?? [] { if let nav = vc as? UINavigationController { // 如果FavVC嵌在导航控制器中(Storyboard常见场景),先解导航控制器 if let favVC = nav.topViewController as? FavVC { favVC.container = container } } else if let favVC = vc as? FavVC { // 如果FavVC直接作为Tab根控制器,直接赋值 favVC.container = container } } } }
额外检查项:请确认Storyboard中TabBar控件的自定义类设置为你写的TabBar类、FavVC控件的自定义类设置为你写的FavVC类,避免自定义类不匹配导致逻辑不生效。
内容的提问来源于stack exchange,提问作者Farhandika
相关产品推荐
相关产品推荐

