2015-05-04 7 views
0

В моем приложении я использую два вида таблиц, привязанных к каждому из них: NSArrayController, а контроллеры массива настроены на использование объектов Core Data. Когда генерируются данные, создается NSObject и значения хранятся в нем с obj.setValue(_:forKey:). После этого объект просто добавляется к контроллеру массива с ac.addObject().Mac OSX - Основные данные не сохраняются

Должно ли не хватить, чтобы Core Data заботился о постоянном хранении данных?

В любом случае, если я попытаюсь сохранить данные, вызвав saveAction(), он сообщает мне, что MOC не имеет никаких изменений (moc.hasChanges = false), поэтому он даже не начинает сохранять данные с помощью этого метода.

Что еще мне нужно для обеспечения того, чтобы Core Data хранит данные правильно и подтвердите изменения?

Контроллеры массива устанавливаются в Interface Builder следующим образом:

  • Режим: Наименование организации
  • Наименование организации: «имя объекта в модели данных»
  • Готовит Содержание проверяется

Они также правильно связаны с контекстом управляемого объекта.

упрощенный, соответствующий код из моего приложения:

/* 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:

Похоже, мое приложение инстанцировании четыре МОС, когда он запускает. Я подозреваю, что способ, которым я добавляю их в Storyboard для двух контроллеров массива, неверен. Я добавил NSObject к двум контроллерам табличных представлений (которые также содержат свои контроллеры массивов) и установил их базовые классы в качестве моего CoreDataDelegate (который является моим классом для основного кода данных, который обычно находится в AppDelegate). Я подозреваю, что здесь создаются несколько экземпляров CoreDataDelegate. Вопрос в следующем: как мне сделать это правильно, чтобы контроллеры массива могли достичь моего класса CoreDataDelegate?

+0

Вы создаете 'NSObject'? Показать код – Wain

+0

Мой код немного сложнее и разбит на несколько классов и т. Д., Но я попытаюсь сделать комбинированный пример ... – BadmintonCat

+0

Я добавил пример кода. – BadmintonCat

ответ

0

Я сделал мой основной делегат данных класса одноплодным, который решил эту проблему для меня ...

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

Тогда у меня есть ссылка на него в моем AppDelegate (который также одноэлементен) ...

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

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

    ... 
} 

Затем в раскадровке я добавил NSObject к моим двум контроллерам табличных представлений и установил базовый класс в AppDelegate. А затем связали ArrayControllers с moc через AppDelegate/coreData.moc.

Теперь создается только один экземпляр CoreDataDelegate (и, следовательно, только один moc), и я могу с радостью сообщить, что сохранение работает сейчас!