gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:02:01 26 4
gpt4 key购买 nike

有没有一种方法可以将 NSArrayController 的内容数组绑定(bind)到一个自定义对象,该对象在技术上不是一个数组,但行为却像一个数组?

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

我最终只想编写一个包装器,将 PDFDocument 的方法转换为 NSMutableArray 的方法,但不确定采取什么方法。我已经进行了几次尝试,但绑定(bind)似乎无法正常工作。

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

谢谢!

最佳答案

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

为了仅查询 PDFDocument 的页面,数组 Controller 和绑定(bind)将使用 -valueForKey:。如 Key-Value Coding Programming Guide: Accessor Search Implementation Details 中所述,它将使用各种命名模式搜索简单的 getter。由于“pages”属性没有简单的 getter,因此它将搜索 indexed collection accessors 。特别是,它将查找 -countOfPages-objectInPagesAtIndex:-pagesAtIndexes: 之一。 PDFDocument 上不存在这些方法,但存在非常相似的方法。您可以使用类别根据可用方法来实现这些。

但是,如果 PDFDocument 将更改其页面列表,并且您希望数组 Controller 自动获取此类更改,那么您就会遇到问题。必须以符合 KVO 的方式修改属性,绑定(bind)才能接受更改。如果插入例程被命名为 -insertObject:inPagesAtIndex:,那么它将符合 KVO 标准,但事实并非如此。它的名称为 -insertPage:atIndex:,KVO 无法识别。这不是你可以用类别来解决的问题,因为重要的是使用什么方法,而不是仅仅可用什么方法。

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

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

关于cocoa - 将 NSArrayController 的内容数组绑定(bind)到自定义(非数组)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32936705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com