跨场景与AppDelegate通信(Cocoa、swift)

跨场景与AppDelegate通信(Cocoa、swift),swift,cocoa,core-data,xcode6,cocoa-bindings,Swift,Cocoa,Core Data,Xcode6,Cocoa Bindings,在Xcode 6 7中,我也希望了解如何获取managedObjectContext并在不同场景中的ViewController中使用它 我启动了一个新的Cocoa项目,点击“使用CoreData” 在CoreData中添加实体,并为其生成managedObject 添加了一个数组控制器,并将其绑定到实体 我想将数组控制器绑定到managedObjectContext,但我还想将视图控制器中的tableView绑定到数组控制器。它们位于不同的场景中,这似乎意味着不同的名称空间。 我试图做的是:

在Xcode 6 7中,我也希望了解如何获取managedObjectContext并在不同场景中的ViewController中使用它

我启动了一个新的Cocoa项目,点击“使用CoreData” 在CoreData中添加实体,并为其生成managedObject 添加了一个数组控制器,并将其绑定到实体 我想将数组控制器绑定到managedObjectContext,但我还想将视图控制器中的tableView绑定到数组控制器。它们位于不同的场景中,这似乎意味着不同的名称空间。 我试图做的是: 在ViewController中设置实例变量:

var managedObjectContext: NSManagedObjectContext!
在视图中,我添加了:

然后,我将表的列绑定到实体的属性。cocoa绑定自动完成,这意味着上下文至少被正确识别

但是,当我运行它时,它会无声地失败:“如果没有托管对象上下文,则无法执行操作”。调试时,上下文被设置为真实对象,但我不知道它是否已实际初始化。我查看了文档和cocoa绑定故障排除,但这似乎是一个coredata问题


我在这里查看过:但是我不能覆盖swift中的正常init,我为您举了一个例子。我有一个实体,叫做Person,有两个属性,名字和年龄。这是我的ViewController:

var managedObjectContext: NSManagedObjectContext!
在IB中,我有一个表视图和一个数组控制器。将阵列控制器的实体设置为个人:

并将阵列控制器的托管对象上下文绑定到viewcontroller的托管对象上下文,在我的示例self.moc中:


然后将表视图的列绑定到数组控制器。

您可以使用self.delegate.managedObjectContext的模型键路径绑定到IB中的应用程序。这是一条又快又脏的路

一些人认为这是不好的,主要是因为他们认为应用程序代理首先不应该拥有MOC。我认为拥有核心数据堆栈的应用程序代理很好


但我要警告的是,这不是未来的证明。如果您想为VC创建一个子MOC,并通过跳过保存来轻松撤消该场景中的所有本地更改,那么最终将在VC上创建并维护MOC属性。

我得到一个CoreData:警告:无法为实体“Person”加载名为PRODUCT\u MODULE\u NAME.Person的类。类未找到,使用默认的NSManagedObjectInstad。我使用的是Xcode 7最新的测试版,在您的.xcdatamodels实体设置中,我有Class:Person和Module:Current Product Module,如果我没记错的话,那么使用什么语法是有问题的,这取决于您是否在子类中使用@objc。我是否可以将它设为一个IBOutlet来实现这一点?你能用一个例子进一步说明吗?@jQwierdy-做什么?要绑定到IB中的应用程序,只需在AC的参数部分的绑定到下拉列表中选择应用程序。IB控件在另一个答案中进行了说明。
import Cocoa

class ViewController: NSViewController {

    // ManagedObjectContext from AppDelegate
    lazy var moc: NSManagedObjectContext = {
        let appDel = NSApplication.sharedApplication().delegate as! AppDelegate
        return appDel.managedObjectContext
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Populate some sample data
        let firstPerson = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: moc) as! Person
        firstPerson.name = "Jesse Pinkman"
        firstPerson.age = 25

    }
}