在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)对象。
-removeObjectFromEmployeesAtIndex:
方法如何调用remove:
方法?-removeObjectFromEmployeesAtIndex:
?答案 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,它解释了如何调用该方法的语义。