代码之家  ›  专栏  ›  技术社区  ›  WH48

使用CoreData和依赖注入-线程1:致命错误:尚未实现init(编码器:)

  •  2
  • WH48  · 技术社区  · 6 年前

    我正在尝试学习如何使用CoreData和正确的实现方法,目前我已经在youtube上观看了这段视频(链接如下)。目前这一切都是有意义的,但是当我从一个viewController转到我的HomeVC(它是选项卡栏控制器的一部分)时,我得到了以下错误。有人知道为什么吗?非常感谢您的帮助,非常感谢!!

    https://www.youtube.com/watch?v=OYRo3i9z-lM

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
        \\ Thread 1: Fatal error: init(coder:) has not been implemented
    }
    

    家庭功能:

    func toHome() {
        self.dismiss(animated: true) {
            if let destVC = UIStoryboard(name: "Home", bundle: nil).instantiateViewController(withIdentifier: "TabBarHomeVC") as? UITabBarController {
                if let homeVC = destVC.viewControllers?.first as? HomeVC {
                    homeVC.persistenceManager = PersistenceManager.shared
                    self.present(destVC, animated: true, completion: nil)
                }
            }
        }
    }
    

    家庭风险投资:

    class HomeVC: UIViewController {
    
        var persistenceManager: PersistenceManager
    
        init(persistenceManager: PersistenceManager) {
            self.persistenceManager = persistenceManager
            super.init(nibName: nil, bundle: nil)
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    

    持久性管理器:

    import Foundation
    import CoreData
    
    final class PersistenceManager {
    
        private init() {}
        static let shared = PersistenceManager()
    
        lazy var persistentContainer: NSPersistentContainer = {
    
            let container = NSPersistentContainer(name: "CoreDataApp")
            container.loadPersistentStores(completionHandler: { (storeDescription, error) in
                if let error = error as NSError? {
    
                    fatalError("Unresolved error \(error), \(error.userInfo)")
                }
            })
            return container
        }()
    
        lazy var context = persistentContainer.viewContext
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Fabian    6 年前

    如果你和segues一起工作 UIViewController Storyboard ,这是通过 init?(coder:) HomeVC 无法从实例化自身 故事板 因为它在那里坠毁了。

    var persistenceManager: PersistenceManager 使斯威夫特无法继承 init(coder:) uiview控制器 ( explanation )因此,您必须为自己提供一个初始化添加的所有变量的位置,以便 uiview控制器

    努力使 var peristenceManager: PersistenceManager 可选,因为您稍后仍要分配它,或者在同一行中为它分配默认值,或者在 所以它是初始化的。也叫 super.init(coder:) 在你的内心 因为在那里它从故事板加载所有设置。

    您不能在任何初始值设定项中提供任何内容,因此必须在初始值设定项运行后进行设置。可以使用静态工厂函数初始化vc实例,然后立即设置所需内容,然后将vc返回到可用状态。

    那么,如何通过将homeVC.persistenceManager=persistenceManager.shared直接传递给homeVC,使其成为homeVC(persistenceManager:persistenceManager.shared)?

    您不能使用该初始值设定项,因为唯一被调用的是 初始值设定项。您可以将变量更改为:

    var persistenceManager: PersistenceManager!
    

    然后可以在 初始化(编码器:) 你有你的实例。

    UITabBarController 初始化 HomeVC公司 , this guy here 有同样的问题,在哪里初始化他的 uiview控制器 被植入,也许能帮到你。答案使用在 uiview控制器 正在显示:

    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        // Initialization code here.
        // Also make sure its only called once if you want
    }
    

    他甚至建造了 如果有人要某张账单。

    你当然可以像以前那样设置,因为 uitabbarc控制器 尚未显示。保持你已经做过的简单。