有没有办法将NSArrayController
的内容数组绑定到一个自定义对象,该对象在技术上不是一个数组,但表现得像一个?
具体来说,我正在尝试将NSTableView
绑定到PDFDocument
(因此,每个文档的PDFPage
表中有一行)。 PDFDocument
不是数组,但有许多相同类型的方法(例如insertPage:atIndex:
,removePageAtIndex:
等。)。
我最终想编写一个将PDFDocument
方法转换为NSMutableArray
方法的包装器,但不确定采取什么方法。我做了一些尝试,绑定似乎没有正常工作。
或者更具体地说,是否可以将表绑定到PDFDocument
的页面以模仿PDFThumbnailView
(对于那些了解PDFKit的人)?
谢谢!
答案 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标准的方法,您必须在类别中实施这些方法或子类。