【问题标题】:Understanding and Reproducing the KVC Hillegass Way to Insert/Remove Objects in/from Controllers理解和重现 KVC Hillegass 方法在控制器中插入/删除对象
【发布时间】:2011-12-15 04:04:56
【问题描述】:

在 Aaron Hillegass 的 Cocoa Programming for Mac OS X 中,Raiseman 应用程序将 Interface Builder (IB) 中的按钮连接到带有发送操作 -remove:NSArrayController。在 MyDocument 类中,他实现了两个 KVC 方法:

- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index;
- (void)removeObjectFromEmployeesAtIndex:(int)index;

当按下这个按钮时,-removeObjectFromEmployeesAtIndex: 方法被调用并且当前选中的 Person (Model) 对象被从数组中移除。

  1. IB中使用的remove:方法如何导致-removeObjectFromEmployeesAtIndex:方法被调用?
  2. 如何使用NSTreeController 重现此效果?

【问题讨论】:

  • 您对树形控制器进行了哪些尝试,又是如何失败的?这将是有用的信息。
  • 假设我有两种节点类型:Folder 和 Person 对象。在 IB 中,通过将树控制器的对象控制器类名称设置为 Folder 或 Person,我可以添加一个或另一个。但这不允许根据树中的深度或使用不同的添加和删除按钮对来添加文件夹或人员。

标签: cocoa interface-builder nsarraycontroller key-value-coding nstreecontroller


【解决方案1】:

如果您想要一个简单的内置选项,那么它只会创建您在 IB 中指定的类的实例。要创建另一个实例,您需要自己编写代码。您应该从树控制器获得所需的所有信息,以便将新类插入层次结构中的适当位置。一些勤奋的搜索应该会给你你需要的代码。

为了帮助您了解NSArrayController 机制的工作原理,我将根据我对Objective-C 和运行时的了解尽可能地解释一下。 Objective-C 是一种非常动态的语言,可以动态调用选择器(方法)。由于NSArrayController 知道您的类的名称(例如“Employee”),它的内部实现可能类似于以下内容(或者很容易):

NSString *removeSelectorName = [NSString stringWithFormat:@"removeObjectFrom%@sAtIndex:",
                                self.objectClassName];
SEL removeSelector = NSSelectorFromString(removeSelectorName);

[dataRepresentation performSelector:removeSelector
                         withObject:[NSNumber numberWithInt:self.selectionIndex];

在 KVO 的其他地方也有这样的例子,比如 +keyPathsForValuesAffecting<Key> 方法 (documentation here),它描述了哪些键会导致另一个键被更新。如果您的密钥被命名为 fullName 并且每当名字或姓氏更改时它都会更新,您可以在您的类中实现它:

+ (NSSet *)keyPathsForValuesAffectingFullName {
    return [NSSet setWithObjects:
            @"firstName",
            @"lastName",
            nil];
}

进一步搜索(和this question)发现了这个documentation page,它解释了如何调用该方法的语义。

【讨论】:

  • 无论如何,IB中使用的remove:方法如何导致-removeObjectFromEmployeesAtIndex:方法被KVC调用?
  • 我以前看过那个问题和文档页面。它说:“mutableArrayValueForKey 的默认搜索模式:是......”问题实际上是:有人怎么会知道 insert: 调用 mutableArrayValueForKey: (如果确实如此)-文档在哪里?现在 Hillegass 和其他人在使用它,但没有说他们是如何知道使用它的。谢谢。
  • 我不确定我是否清楚你不明白什么。通过阅读文档,有人会知道-insert: 调用-insertObject:in<ArrayName>AtIndex::这就是文档存在的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
相关资源
最近更新 更多