了解并重现KVC Hillegass在控制器中插入/移除对象的方法

时间:2011-12-13 17:03:55

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

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

-remove:

按下此按钮时,将调用- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index; - (void)removeObjectFromEmployeesAtIndex:(int)index; 方法,并从阵列中删除当前选定的Person(Model)对象。

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

1 个答案:

答案 0 :(得分:0)

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

为了帮助您了解NSArrayController机制的工作原理,我将从Objective-C和运行时的知识中解释出最好的解释。 Objective-C是一种非常动态的语言,您可以动态调用选择器(方法)。由于NSArrayController知道您班级的名称(例如"员工"),因此其内部实施可能类似于以下内容(或很容易):

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,它解释了如何调用该方法的语义。