2016-03-14 8 views
1

У меня есть базовые данные, основанные на документе, приложение OS X для раскадровки.Создание управляемого объекта Контекст, доступный контроллеру массива в сценарии раскадровки

Существует тест проекта здесь:

https://github.com/ericgorr/sb_ac_doc

который только проект по умолчанию Xcode создает с некоторыми изменениями.

У меня есть один контроллер вида, и представление содержит табличный вид, который в конечном итоге отобразит данные в документе Core Data. Я также буду использовать контроллер массива для управления строками для представления таблицы.

три сцены:

  • Применение Сцена
  • Главная View Controller Scene
  • Окно контроллера Сцена

Main View Controller Scene содержит TestItem массива контроллер ,

TestItem View Controller содержит код:

class ViewController: NSViewController 
{ 
    var context: NSManagedObjectContext? 

    // 
    // ... 
    //  
} 

TestItem массив Контроллер содержит параметры Переплет:

Managed Object Context 
    Bind to: Main View Controller 
    Model Key Path: context 

В Document.swift:

override func makeWindowControllers() 
{ 
    let moc = self.managedObjectContext! 

    // Returns the Storyboard that contains your Document window. 
    let storyboard   = NSStoryboard(name: "Main", bundle: nil) 
    let windowController = storyboard.instantiateControllerWithIdentifier("Document Window Controller") as! NSWindowController 
    let contentController = windowController.contentViewController as! ViewController 

    NSLog("%@", self.managedObjectContext!) 

    contentController.context = self.managedObjectContext! 

    NSLog("%@", contentController.context!) 

    self.addWindowController(windowController) 
} 

Это моя попытка передать MOC контроллеру вида, прежде чем контроллер массива попытается получить к нему доступ.

NSLog оба печатают допустимые значения.

Однако, я получаю следующее сообщение аварии:

2016-03-13 20:13:02.667 sb_ac_doc[73021:16415257] Cannot perform operation without a managed object context 
2016-03-13 20:13:02.669 sb_ac_doc[73021:16415257] (
    0 CoreFoundation      0x00007fff956f9ae2 __exceptionPreprocess + 178 
    1 libobjc.A.dylib      0x00007fff9a09073c objc_exception_throw + 48 
    2 CoreFoundation      0x00007fff956f998d +[NSException raise:format:] + 205 
    3 AppKit        0x00007fff8c8224e7 -[_NSManagedProxy _managedObjectContext] + 66 
    4 AppKit        0x00007fff8c822507 -[_NSManagedProxy _persistentStoreCoordinator] + 22 
    5 AppKit        0x00007fff8c82257a -[_NSManagedProxy _entity] + 46 
    6 AppKit        0x00007fff8c822802 -[_NSManagedProxy fetchRequestWithSortDescriptors:limit:] + 89 
    7 AppKit        0x00007fff8c821fec -[NSObjectController(NSManagedController) _executeFetch:didCommitSuccessfully:actionSender:] + 75 
    8 AppKit        0x00007fff8c5c18c2 -[NSController _controllerEditor:didCommit:contextInfo:] + 185 
    9 CoreFoundation      0x00007fff955c417c __invoking___ + 140 
    10 CoreFoundation      0x00007fff955c3fce -[NSInvocation invoke] + 286 
    11 CoreFoundation      0x00007fff95663be6 -[NSInvocation invokeWithTarget:] + 54 
    12 Foundation       0x00007fff87cce345 __NSFireDelayedPerform + 377 
    13 CoreFoundation      0x00007fff9563fbc4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20 
    14 CoreFoundation      0x00007fff9563f853 __CFRunLoopDoTimer + 1075 
    15 CoreFoundation      0x00007fff956bde6a __CFRunLoopDoTimers + 298 
    16 CoreFoundation      0x00007fff955facd1 __CFRunLoopRun + 1841 
    17 CoreFoundation      0x00007fff955fa338 CFRunLoopRunSpecific + 296 
    18 HIToolbox       0x00007fff8add1935 RunCurrentEventLoopInMode + 235 
    19 HIToolbox       0x00007fff8add1677 ReceiveNextEventCommon + 184 
    20 HIToolbox       0x00007fff8add15af _BlockUntilNextEventMatchingListInModeWithFilter + 71 
    21 AppKit        0x00007fff8c25e0ee _DPSNextEvent + 1067 
    22 AppKit        0x00007fff8c62a943 -[NSApplication _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 454 
    23 AppKit        0x00007fff8c253fc8 -[NSApplication run] + 682 
    24 AppKit        0x00007fff8c1d6520 NSApplicationMain + 1176 
    25 sb_ac_doc       0x0000000100002427 main + 87 
    26 libdyld.dylib      0x00007fff987455ad start + 1 
) 

Что такое правильная модель следует использовать таким образом, контроллер массива может получить доступ к MOC документа?

ответ

1

Если вы используете привязки, вам нужно модифицировать свойства с помощью KVO-совместимого способа. Положите dynamic перед var context: NSManagedObjectContext?.

-1

Я думаю, что свойство context ViewController отсутствует. Предположим, у нас есть Core Data Stack. Обычно он может быть сгенерирован автоматически после проверки опции Use Core Data при создании нового проекта.

enter image description here

А затем реализации managedObjectContext, которая создается в AppDelegate для context из ViewController:

var context: NSManagedObjectContext? { 
    guard let appDelegate = NSApplication.sharedApplication().delegate as? AppDelegate else { 
     return nil 
    } 
    return appDelegate.managedObjectContext 
} 

Что касается других незначительных изменений, я создал запрос тянуть через GitHub. Пожалуйста, возьмите его для справки.

+0

Я не уверен, что это сработает для приложения, которое будет иметь несколько документов и, следовательно, несколько MOC. Почему бы не передать MOC из документа в makeWindowControllers в ViewController перед запуском кода, который приводит к сбою при сбое? – ericg

+0

@ericgorr Я думаю, что речь идет о принятии решений. Если вы предпочитаете передавать MOC из документа в makeWindowControllers в ViewController, '' Подготовить контент'' должен быть отмечен в IB, потому что раскадровка, загруженная раньше MOC, готова. Если вы предпочитаете хранить «Подготовку контента», вы можете найти учебник от RAYWENDERLICH : https://www.raywenderlich.com/21752/how-to-use-cocoa-bindings-and-core-data-in -a-mac-app и проверить весь проект. Он готовит MOC в классе AppDelegate. – Allen

+0

AppDelegate не имеет MOC. Каждый документ имеет свой собственный MOC. – Willeke