Cocoa:NSArrayController可以被子类化以提供自定义的“Controller Key”吗?

时间:2012-04-02 20:33:37

标签: cocoa cocoa-bindings key-value-observing nsarraycontroller subclassing

若然,如何?

这似乎是一件非常有用的事情,但我不能为我的生活弄明白或在网上找到任何信息!

我想到的具体情况是我有两个相邻的表,左边最初包含一个名称列表,然后我想“向左移动”和“向右移动”按钮将名称从一个表移动到另一个表。

我认为这个问题的优雅解决方案是使用一个带有两个Controller Keys的数组控制器“arrangeLeftObjects”和arrangeRightObjects“

我在这里疯了!有人可以请一些亮点。我会根据请求发布示例代码。

非常感谢

编辑:初次尝试

NSArrayController子类实现(到目前为止):

@interface LeftRightArrayController : NSArrayController {
    NSArray * leftObjects;
}

-(NSArray *)leftObjects;
-(void)setLeftObjects:(NSArray *)newLeftObjects;
@end


@implementation LeftRightArrayController

-(NSArray *)leftObjects {
    return leftObjects;
}

-(void)setLeftObjects:(NSArray *)newLeftObjects {
    leftObjects = newLeftObjects;
}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    [self setLeftObjects:[NSArray arrayWithArray:[self arrangedObjects]]];  
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

@end

提供给控制器的数据:

[myArrayController addObserver:myArrayController forKeyPath:@"arrangedObjects" options:0 context:NULL];

NSString *myKey = [NSString stringWithString:@"name"];
NSDictionary *myNewDictionary1 = [NSDictionary dictionaryWithObject:@"date1" forKey:myKey];

NSArray *myArray = [NSArray arrayWithObjects:myNewDictionary1, nil];

[myArrayController setContent:myArray];

当我只绑定到“Left Right Array Controller.arrangedObjects.name”时,此代码有效 但是一旦我尝试绑定到“Left Right Array Controller.leftObjects.name”

,就会中断

1 个答案:

答案 0 :(得分:0)

你不想这样做。您应该始终为每个表视图使用一个NSArrayController。在您的情况下,您应该有两个支持数组,一个用于左对象,另一个用于右对象。

然后,您应该通过自己的数组控制器将每个表视图绑定到相应的数组。

然后,您应该实现一个单独的控制器来管理数组之间的数据传输,方法是使用符合KVO的访问器直接操作数组,或者使用NSArrayController的各种插入/删除方法。