Using CoreData and Dependency Injection - Thread 1: Fatal error: init(coder:) has not been implemented
Using CoreData and Dependency Injection - Thread 1: Fatal error: init(coder:) has not been implemented
我正在尝试学习如何使用 CoreData 以及实现它的正确方法,目前我已经在 youtube 上观看了这个视频(link 下面)。目前这一切都有意义,但是当我从一个 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)
}
}
}
}
首页VC:
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
}
如果您使用 segues,那么 UIViewController
是从 Storyboard
实例化的,这是通过 init?(coder:)
初始化程序完成的。你让它不可用会使 HomeVC
无法从 Storyboard
实例化自身,因为它在那里崩溃了。
属性 var persistenceManager: PersistenceManager
使得 Swift 无法从 UIViewController
(explanation) 继承 init(coder:)
所以你必须提供一个对于你自己,你在其中初始化你添加的所有变量,所有这些都是为了让 UIViewController
进入可用状态。
尝试使 var peristenceManager: PersistenceManager
可选,因为无论如何您稍后都会分配它,或者在同一行中为其分配默认值,或者在 init?(coder:)
期间为其分配一个值,以便它被初始化。还要在 init?(coder:)
中调用 super.init(coder:)
,因为它会从 Storyboard 加载所有设置。
使用 Storyboard
你不能在任何初始化器中提供东西,所以你必须在初始化器完成后设置它 运行。您可以在初始化 vc 实例的地方使用静态工厂函数,然后立即设置您想要的内容,然后 return 处于可用状态的 vc。
So how can I make homeVC.persistenceManager = PersistenceManager.shared, into HomeVC(persistenceManager: PersistenceManager.shared) by passing it through the tabBarController straight to HomeVC?
您不能使用该初始化程序,因为唯一被调用的是 init?(coder:)
初始化程序。您可以将变量更改为:
var persistenceManager: PersistenceManager!
然后你可以在 init(coder:)
被调用后设置变量并且你有你的实例。
这里UITabBarController
初始化HomeVC
,this guy here有同样的问题,在哪里初始化他的UIViewController
被嵌入,也许它可以帮助你。答案使用在显示 UIViewController
之前调用的调用:
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
// Initialization code here.
// Also make sure its only called once if you want
}
如果需要某个选项卡,他甚至会自己构建 UIViewController
。
你当然可以像你已经做的那样设置它,因为 UITabBarController
还没有显示。像您一样保持简单。
我正在尝试学习如何使用 CoreData 以及实现它的正确方法,目前我已经在 youtube 上观看了这个视频(link 下面)。目前这一切都有意义,但是当我从一个 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)
}
}
}
}
首页VC:
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
}
如果您使用 segues,那么 UIViewController
是从 Storyboard
实例化的,这是通过 init?(coder:)
初始化程序完成的。你让它不可用会使 HomeVC
无法从 Storyboard
实例化自身,因为它在那里崩溃了。
属性 var persistenceManager: PersistenceManager
使得 Swift 无法从 UIViewController
(explanation) 继承 init(coder:)
所以你必须提供一个对于你自己,你在其中初始化你添加的所有变量,所有这些都是为了让 UIViewController
进入可用状态。
尝试使 var peristenceManager: PersistenceManager
可选,因为无论如何您稍后都会分配它,或者在同一行中为其分配默认值,或者在 init?(coder:)
期间为其分配一个值,以便它被初始化。还要在 init?(coder:)
中调用 super.init(coder:)
,因为它会从 Storyboard 加载所有设置。
使用 Storyboard
你不能在任何初始化器中提供东西,所以你必须在初始化器完成后设置它 运行。您可以在初始化 vc 实例的地方使用静态工厂函数,然后立即设置您想要的内容,然后 return 处于可用状态的 vc。
So how can I make homeVC.persistenceManager = PersistenceManager.shared, into HomeVC(persistenceManager: PersistenceManager.shared) by passing it through the tabBarController straight to HomeVC?
您不能使用该初始化程序,因为唯一被调用的是 init?(coder:)
初始化程序。您可以将变量更改为:
var persistenceManager: PersistenceManager!
然后你可以在 init(coder:)
被调用后设置变量并且你有你的实例。
这里UITabBarController
初始化HomeVC
,this guy here有同样的问题,在哪里初始化他的UIViewController
被嵌入,也许它可以帮助你。答案使用在显示 UIViewController
之前调用的调用:
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
// Initialization code here.
// Also make sure its only called once if you want
}
如果需要某个选项卡,他甚至会自己构建 UIViewController
。
你当然可以像你已经做的那样设置它,因为 UITabBarController
还没有显示。像您一样保持简单。