0

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

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

按下此按钮时,将-removeObjectFromEmployeesAtIndex:调用该方法并从数组中删除当前选定的 Person (Model) 对象。

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

1 回答 1

0

如果您想要一个简单的内置选项,那么它只会创建您在 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>方法(文档here)一样,它描述了哪些键导致另一个键被更新。如果您的密钥被命名fullName并且每当名字或姓氏更改时它都会更新,您将在您的类中实现它:

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

进一步搜索(和这个问题)出现了这个文档页面,它解释了如何调用该方法的语义。

于 2011-12-14T13:04:12.737 回答