将 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.
有没有办法将 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.