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

Binding NSArrayController's content array to a custom (non-array) object

有没有办法将 NSArrayController 的内容数组绑定到从技术上讲不是数组但行为类似的自定义对象?

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

我最终只想编写一个包装器,将 PDFDocument 的方法转换为 NSMutableArray 的方法,但不确定采用何种方法。我已经尝试了几次,但绑定似乎无法正常工作。

或者,更具体地说,有什么方法可以将 table 绑定到 PDFDocument 的页面以模仿 PDFThumbnailView(对于那些了解 PDFKit 的人)?

谢谢!

绑定建立在键值观察和键值编码的基础上。

仅查询 PDFDocument 的页面,数组控制器和绑定将使用 -valueForKey:。如 Key-Value Coding Programming Guide: Accessor Search Implementation Details, that will search for a simple getter using a variety of naming patterns. Since there's no simple getter for a "pages" property, it will search for the indexed collection accessors 中所述。特别是,它将查找 -countOfPages-objectInPagesAtIndex:-pagesAtIndexes: 之一。 None 存在于 PDFDocument 上,但存在非常相似的方法。您可以使用类别根据可用方法来实现这些。

但是,如果 PDFDocument 将改变其页面列表并且您希望阵列控制器自动获取此类更改,那么您就有问题了。 属性 必须以符合 KVO 的方式进行修改,以便绑定接收更改。如果插入例程被命名为 -insertObject:inPagesAtIndex:,那将是符合 KVO 的,但事实并非如此。它被命名为 -insertPage:atIndex:,KVO 无法识别它。这不是您可以通过类别解决的问题,因为重要的是使用了哪种方法,而不是仅仅可用的方法。

您可以尝试使用覆盖 -insertPage:atIndex:PDFDocument 的子 class 在调用 super 之前和之后调用 -willChange:valuesAtIndexes:forKey:-didChange:valuesAtIndexes:forKey: .但是,不能保证所有插入甚至都通过 public 方法。有可能 class 有时可以直接修改其内部状态,而无需调用 subclass 可以正确覆盖的任何方法。 (同样适用于删除方法。)

如果您确定所有变更都是由您的代码发起的,您可以让您的代码使用符合 KVO 的方法,您必须在类别或子class.