NSPersistentDocument,Storyboard和NSArrayController =关闭

时间:2015-10-28 15:38:07

标签: macos cocoa-bindings nsdocument

问题:关闭文档窗口会产生以下异常:

An instance 0x600000140630 of class SimpleApp.Document was deallocated while key value 
observers were still registered with it. Current observation info:  <NSKeyValueObservationInfo 0x6100000424f0> …

<NSKeyValueObservance 0x6100000c2f40: Observer: 0x6280000c7a10, Key path: managedObjectContext, Options: <New: NO, Old: NO, Prior: NO> Context: 0x0, Property: 0x6100000429a0>

-[NSAutoreleasePool drain]: This pool has already been drained, do not release it (double release).

在这里'我做了什么:

使用以下方法创建一个新的Xcode项目:

  • 使用故事板
  • 创建基于文档的应用程序
  • 使用核心数据

在Document.xcdatamodeld

  • 创建了一个具有2个属性,宽度和长度的实体(部分)

在Main.storyboard中,

  • 将表格视图(基于视图),2个按钮(“添加”和“删除”)和一个ArrayController拖到视图控制器

  • ArrayController模式设置为Entity

绑定:

  • tableView内容:ArrayController arrangeObjects,Selection Indexes:ArrayController selectionIndexes
  • 2个表视图单元格绑定到表格单元格视图,keyPath:objectValue.width和objectValue.length

现在第一个问题是绑定ArrayController managedObjectContext。我需要一个Document子类的引用。所以我添加了

weak var document: Document? {
    didSet {
        print("ViewController, document didSet")
    }
}
在ViewController中

并将ArrayController托管对象上下文绑定到它(document.managedObjectContext)。

尝试了,但没有成功,在各个地方设置这个var(ViewController.viewDidLoad(),在NSWindowController子类的windowDidLoad()中,NSDocumentController.sharedDocumentController().documentForWindow(self.window!)总是为零。

我使用Document.makeWindowControllers()

中的以下内容工作
if let viewController = windowController.contentViewController {
     viewController.setValue(self, forKey: "document")
}

所以,现在我可以创建一个新文档并保存它,打开一个保存的文档,但是当我关闭窗口时,我得到了上一个异常。我将deinit方法添加到视图控制器和文档中,并在调用Document.deinit之后但在ViewController.deinit之前发生异常。所以看起来数组控制器仍然在观察不再存在的Document managedObjectContext。

也许我在这里遗漏了一些明显的东西,但我找不到一个关于如何一起使用故事板,数组控制器和文档的简单示例。顺便说一句,我也试过没有核心数据并得到了同样的例外。

已更新

我做了一个github项目 https://github.com/Miyan0/SimpleApp.git

重现崩溃的步骤:

  • 创建新文档
  • 保存
  • 重新开启文件
  • 进行任何修改
  • 点击关闭框(不保存)
  • 碰撞

1 个答案:

答案 0 :(得分:0)

看起来解决此问题的唯一方法是将ViewController中的文档引用从弱更改为强。

我担心它可能会导致保留周期,但它不会(根据ViewController和Document的print语句和deinit方法)。我试图涵盖所有可能的情况,即使有时文档在关闭它的窗口后没有被释放,它最终会在创建新文档或修改另一个文档时解除分配。