将NSArrayController的内容数组绑定到自定义(非数组)对象

时间:2015-10-04 18:12:31

标签: cocoa cocoa-bindings nsarraycontroller

有没有办法将NSArrayController的内容数组绑定到一个自定义对象,该对象在技术上不是一个数组,但表现得像一个?

具体来说,我正在尝试将NSTableView绑定到PDFDocument(因此,每个文档的PDFPage表中有一行)。 PDFDocument不是数组,但有许多相同类型的方法(例如insertPage:atIndex:removePageAtIndex:等。)。

我最终想编写一个将PDFDocument方法转换为NSMutableArray方法的包装器,但不确定采取什么方法。我做了一些尝试,绑定似乎没有正常工作。

或者更具体地说,是否可以将表绑定到PDFDocument的页面以模仿PDFThumbnailView(对于那些了解PDFKit的人)?

谢谢!

1 个答案:

答案 0 :(得分:2)

绑定建立在键值观察和键值编码之上。

要仅查询PDFDocument的页面,数组控制器和绑定将使用-valueForKey:。如Key-Value Coding Programming Guide: Accessor Search Implementation Details中所述,它将使用各种命名模式搜索简单的getter。因为对于"页面没有简单的吸气剂"属性,它将搜索indexed collection accessors。特别是,它会查找-countOfPages以及-objectInPagesAtIndex:-pagesAtIndexes:中的一个。 PDFDocument上没有这些,但存在非常类似的方法。您可以使用类别根据可用方法实现这些。

但是,如果PDFDocument将改变其页面列表并且您希望阵列控制器自动获取此类更改,则表示您遇到了问题。必须以符合KVO的方式修改属性,以便绑定以获取更改。如果插入例程名为-insertObject:inPagesAtIndex:,那将符合KVO标准,但事实并非如此。它被命名为-insertPage:atIndex:,KVO无法识别。这不是您可以使用类别修复的内容,因为重要的是使用的方法,而不仅仅是可用的方法。

您可以尝试使用PDFDocument的子类覆盖-insertPage:atIndex:,在调用super之前和之后调用-willChange:valuesAtIndexes:forKey:-didChange:valuesAtIndexes:forKey:。但是,并不能保证所有插入都会通过公共方法进行。该类有时可以直接修改其内部状态,而无需调用子类可以正确覆盖的任何方法。 (所有这些都适用于删除方法。)

如果您确定所有突变都是由您的代码启动的,那么您可以使代码使用符合KVO标准的方法,您必须在类别中实施这些方法或子类。