按照 Wain 的建议,最佳做法是让主视图控制器将托管对象上下文传递给设置视图控制器。
这称为依赖注入,下面是您通过 segue 执行此操作的方法:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showSettings" {
if let destinationVC = segue.destinationViewController as? SettingsViewController{
// Pass our managed object context to the settings controller
destinationVC.managedObjectContext = managedObjectContext
}
}
}
您可以将managedObjectContext 属性添加到您的设置视图控制器,如下所示:
import CoreData
class SettingsViewController: UIViewController {
var managedObjectContext : NSManagedObjectContext?
依赖注入的好处是每个视图控制器只使用它提供的上下文,而不是寻找一个“已知”的地方(例如AppDelegate)来获取全局托管对象上下文。
这消除了视图控制器和AppDelegate 之间的紧密耦合,还让您可以灵活地在整个应用程序中使用多个NSManagedObjectContext,随着项目规模和复杂性的增长,这通常变得很重要。
Apple 在其Accessing the Core Data Stack 文档中推荐了这种做法:
当你创建一个视图控制器时,你将它应该传递给它的上下文
采用。你传递一个现有的上下文,或者(在你想要的情况下
新的控制器来管理一组离散的编辑)一个新的上下文
你为它创造的。这通常是由
应用程序委托创建上下文以传递给第一个视图
显示的控制器。
视图控制器通常不应该从
全局对象,例如应用程序委托——这使得
应用架构僵化。
更新:
在回答您关于如何创建 NSManagedObject 的评论时,您只需要一个 NSManagedObjectContext,这是您的第二个视图控制器现在拥有的。
let employee = NSEntityDescription.insertNewObjectForEntityForName("Employee", inManagedObjectContext: self.managedObjectContext) as! Employee
请参阅 Apple 的 Core Data Programming Guide 中的 Creating and Saving Managed Objects 了解更多详情。
您的任何视图控制器都不需要访问AppDelegate,因为您现在正在传递一个上下文供它们使用。