将NSArrayController绑定到Core Data文档的托管对象上下文的新方法是什么?

the*_*wan 13 xcode core-data interface-builder cocoa-bindings

在Xcode去为OS X应用程序添加Storyboard之前,您可以通过将数组控制器绑定Managed Object ContextFile's Owner一个Model Key Pathof 来将数组控制器连接到文档的托管对象上下文managedObjectContext.有了故事板,就再也没有了File's Owner,从现在开始你从哪里获得背景?

Apple的文档落后于这个领域,在Xcode中没有任何明显的地方可以绑定.显然,我可以回到非故事板路线并使用旧方法,但必须有一种新方法.

the*_*wan 10

所以我得到了Apple的答案.这是基于文档的核心数据应用程序,代码全部在Swift中,但在Objective-C中的想法是相同的,您只需要翻译它.

他们给我的第一个答案是将数组控制器绑定到运行视图的视图控制器,模型关键路径为self.view.window.windowController.document.managedObjectContex.我展示的示例使用了这种方法并且根本没有任何错误消息,但它是一个带有一个阵列控制器的窗口控制器内的单个视图控制器.我的设置是一个窗口,指向一个场景中带有两个阵列控制器的视图的选项卡视图.Cannot perform operation without a managed object context每次打开或创建新文档时我仍然会得到一次.对我有用的第二个解决方案是仍然将数组控制器绑定到视图控制器,但是使用模型关键路径self.representedObject.managedObjectContext然后添加到文档类makeWindowControllers()函数的末尾:

override func makeWindowControllers() {
……
    let tabViewController = windowController.contentViewController as NSTabViewController
    for object in tabViewController.childViewControllers {
        let childViewController = object as NSViewController
        childViewController.representedObject = self
    }
}
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.希望这里有足够的信息显示其他人谷歌这个问题.


San*_*man 9

使用默认的Xcode生成项目并包含CoreData将managedObjectContext成员放在AppDelegate.您可以将以下代码添加到ViewController,然后将其managedObjectContext用作"模型密钥路径"并绑定到ViewController您的NSArrayController.

lazy var managedObjectContext: NSManagedObjectContext = { 
    return (NSApplication.sharedApplication().delegate
        as? AppDelegate)?.managedObjectContext }()!
Run Code Online (Sandbox Code Playgroud)

这只是创建一个成员,重定向到您的实际MOC存储位置.这很有用,因为之前发生了NSArrayController绑定viewDidLoad(),因此实例成员为什么不够用.此外,如果要重构单个CoreDataManager类,只需更改重定向到的位置即可.此外,您可以将其添加为类扩展,以使所有人ViewControllers都能访问您的MOC.

Objective-C版本根据要求:

@interface MyViewController ()

@property (nonatomic, readonly) NSMangedObjectContext* managedObjectContext;

@end

@implementation MyViewController

- (NSManagedObjectContext*)managedObjectContext
{
    return ((AppDelegate*)([NSApplication sharedApplication].delegate)).managedObjectContext;
}

...

@end
Run Code Online (Sandbox Code Playgroud)