2015-05-04 83 views
0

在我的应用程序中,我使用了绑定到它们的每个NSArrayController的两个表视图,并且阵列控制器被设置为使用核心数据实体。生成数据时,将创建一个NSObject,并使用obj.setValue(_:forKey:)将值存储在其中。在此之后,该对象仅通过ac.addObject()添加到阵列控制器。Mac OSX - 核心数据未被存储

这应该不足以让Core Data负责数据的持久存储吗?

无论如何,如果我试图通过调用saveAction()来保存数据,它会告诉我MOC没有变化(moc.hasChanges = false),所以它甚至没有开始用这种方法保存数据。

我还需要照顾使Core Data正确存储数据并确认更改吗?

阵列控制器在界面生成器设置如下:

  • 模式:实体名称
  • 实体名称:
  • 准备内容检查
“在数据模型实体的名称”

它们也正确绑定到托管对象上下文。

简化,从有关我的应用程序代码:

/* Clear existing data. */ 
    let range:NSRange = NSMakeRange(0, arrayController.arrangedObjects.count); 
    let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range); 
    arrayController.removeObjectsAtArrangedObjectIndexes(indexSet); 

    let array = generateData(); 

    /* Generate data. */ 
    for i in 0 ..< array.count 
    { 
     let data = array[i]; 

     /* Create new data object. */ 
     var obj:NSObject = arrayController.newObject() as! NSObject; 
     obj.setValue(data.name, forKey: "name"); 
     obj.setValue(data.type, forKey: "type"); 
     obj.setValue(data.category, forKey: "category"); 

     /* Add it to the array controller's contentArray. */ 
     arrayController.addObject(obj); 
    } 

UPDATE:

它看起来像我的应用程序实例4个MOCS当它启动。我怀疑我如何将它们添加到两个阵列控制器的Storyboard中是错误的。我向两个表视图控制器(也包含它们的数组控制器)添加了一个NSObject,并将它们的基类设置为我的CoreDataDelegate(这是我的核心数据代码类,通常位于AppDelegate)。我怀疑这是创建多个实例CoreDataDelegate的地方。问题是:我应该怎么做,以便阵列控制器可以达到我的CoreDataDelegate类?

+0

你创建一个'NSObject'?显示代码 – Wain

+0

我的代码稍微复杂一点,可以分成几个类,但我会尝试做一个组合的例子... – BadmintonCat

+0

我已经添加了代码示例。 – BadmintonCat

回答

0

我做我的核心数据委托类一个Singleton这解决了这个问题对我来说...

class CoreDataDelegate : NSObject 
{ 
    static let instance = CoreDataDelegate(); 
    ... 
} 

然后,我在我的AppDelegate对它的引用(这也是一个singleton)...

@NSApplicationMain 
class AppDelegate : NSObject, NSApplicationDelegate 
{ 
    static let instance = AppDelegate(); 
    let coreData:CoreDataDelegate; 

    override init() 
    { 
     coreData = CoreDataDelegate.instance; 
     super.init(); 
    } 

    ... 
} 

然后在故事板中,我添加了一个NSObject到我的两个表视图控制器,并将基类设置为AppDelegate。然后通过AppDelegate/coreData.moc将ArrayControllers绑定到moc。

现在只有一个CoreDataDelegate实例被创建(因此只有一个moc),我现在可以愉快地报告现在的保存工作!