2015-05-04 81 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),我現在可以愉快地報告現在的保存工作!