2012-08-17 74 views
3

我想以编程方式将自定义类(MyClass)数组绑定到数组控制器(NSArrayController),并将其内容绑定到另一个数组(modelArray)。 MyClass显示器阵列的内容,例如一个NSTableView如何绑定到NSArrayController的排列对象

我的问题是:如何建立这种以这样的方式使可变数组的方法被称为绑定,即方法

-(void) insertObject:(id)object inContentAtIndex:(NSUInteger)index 
-(void) removeObjectFromContent:(id) object 

(1)如果我以这种方式结合,上述方法被调用但控制器的内容不再绑定到modelArray(显然)

[myArrayController bind:@"contentArray" toObject:myClassInstance withKeyPath:@"content" options:nil]; 

(2)如果我在这些方面结合只有setContent:content方法被调用,而不是可变的方法。此外,我一直试图删除这些方法(setContent:content),但它只是抛出一个异常setValue:forUndefinedKey:

[myClassInstance bind:@"content" toObject:myArrayController withKeyPath:@"arrangedObjects" options:nil]; 

[myClassInstance bind:@"content" toObject:myArrayController withKeyPath:@"content" options:nil]; 

我不认为整个表的数组重新设置每次绑定到数组控制器时添加一行,并且我希望具有相同类型的绑定。

回答

2

问题您遇到有数组值是如何通过键值编码处理的事情。 KVC没有具体打字的概念,所以当你通过KVC访问一个数组的值,它无法知道返回的数组是可变的方式。它必须假设最差(即数组是不可变的)。它通常用于处理这个问题的方法是使用代理对象,行为像一个NSMutableArray,但幕后它需要你的假设,不变的阵列,使一个可变的副本,变异副本,然后推动整个事情重新使用二传手。 (这是您看到的行为 - 整个阵列正在被替换而不是在原位发生突变。)

控制此功能的方法是- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key。有可能有很多在该方法回事,我会在标题注释中粘贴下面这个方法给予完整的故事,但要长话短说,如果你想NSArrayController的变异你的可变数组到位,最简单的办法是此重写添加到出售该modelArray属性的类:

- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key 
{ 
    if ([@"modelArray" isEqual: key]) 
    { 
     // We know this is mutable, even if KVC doesn't! 
     return self.modelArray; 
    } 
    return [super mutableArrayValueForKey:key]; 
} 

较长的故事是,有事情的序列KVC看起来试图弄清楚如何处理收集的突变时。他们在NSKeyValueCoding.h详细解释。这些是对mutableArrayValueForKey:的评论。

鉴于标识有序一对多关系的关键,返回 一个可变的阵列,可提供给相关 对象进行读写访问。对象添加到可变数组将成为关系到 接收机,和对象从可变数组移除将变得 无关。

此方法的默认实现识别一样简单 访问方法和数组访问方法为-valueForKey:'s和 遵循相同的直接实例变量的访问策略,但始终 返回可变集合代理对象,而不是-valueForKey:将返回的不变的 集合。它还:

  1. 搜索类的接收器的对于名称匹配-insertObject:in<Key>AtIndex:-removeObjectFrom<Key>AtIndex:(对应于由NSMutableArray的类中定义的两个最原始的方法)的图案的方法,和 (Mac OS中10.4引入)也-insert<Key>:atIndexes:-remove<Key>AtIndexes:(对应于-[NSMutableArray insertObjects:atIndexes:]-[NSMutableArray removeObjectsAtIndexes:])。如果至少一个插入方法和在 至少一种去除方法被发现发送到 每个的NSMutableArray消息收集代理对象将导致 -insertObject:in<Key>AtIndex:-removeObjectFrom<Key>AtIndex:-insert<Key>:atIndexes:-remove<Key>AtIndexes:消息的一些组合被发送到的-mutableArrayValueForKey:原接收机。如果接收机的类别还实现了名称为 的模式-replaceObjectIn<Key>AtIndex:withObject:或 (Mac OS 10.4中引入)-replace<Key>AtIndexes:with<Key>:的 方法将在适当时用于最佳性能的可选方法。
  2. 否则(没有找到任何一组数组变异方法),在接收者的类中搜索名称与 模式-set<Key>:匹配的访问方法。如果发现这种方法,则发送到收集代理对象的每个NSMutableArray 消息将导致将 -set<Key>:消息发送到-mutableArrayValueForKey:的原始接收方。
  3. 否则(没有一套阵列突变方法或简单的访问方法被发现),如果接收器的类 +accessInstanceVariablesDirectly方法返回YES,搜索类的接收器的一个实例变量名称的 图案_<key><key>相匹配,以该顺序。如果找到这样一个实例变量 ,则发送到集合代理 对象的每个NSMutableArray消息都将被转发给实例变量的值,因此该值通常必须是NSMutableArray的实例或NSMutableArray的子​​类。
  4. 否则(找不到数组变量方法,简单访问器方法或实例变量被找到),无论如何返回可变集合 代理对象。发送到 收集代理对象的每个NSMutableArray消息将导致将消息发送到原始接收者 -mutableArrayValueForKey:-setValue:forUndefinedKey:的默认实现会引发NSUndefinedKeyException,但您可以在应用程序中覆盖它。
相关问题