【问题标题】:Cocoa: Can NSArrayController be subclassed to provide custom "Controller Key"s?Cocoa:NSArrayController 可以被子类化以提供自定义的“控制器键”吗?
【发布时间】:2012-04-02 20:33:36
【问题描述】:

如果是这样,怎么做?

这似乎是一件非常有用的事情,但我一生都无法弄清楚或在网上找到任何信息!

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

我认为这个问题的一个优雅的解决方案是使用一个数组控制器和两个控制器键“arrangedLeftObjects”和arrangedRightObjects“

我要疯了!有人可以阐明一下。我会根据要求发布示例代码。

非常感谢

编辑:初步尝试

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”就会中断

【问题讨论】:

  • 发布一个你已经尝试过的例子。
  • 我已经放了一些代码。似乎自定义控制器键将是一件非常有用的事情,而且我在任何地方都没有看到任何提及它,所以我开始怀疑。

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


【解决方案1】:

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

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

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

【讨论】:

  • 对于只用一个或几个自定义键就可以实现的(在我可能幼稚的想法)来说,阵列控制器的数量似乎很荒谬。
  • 说我疯了,想按照自己的方式去做,可以吗?可以做到吗?为什么它如此不受欢迎?
  • 因为阵列控制器不是这样工作的。每个表视图应该始终有一个数组控制器。这就是它们的设计方式。我不认为两个阵列控制器而不是一个是“疯狂的”。如果你不需要,你不应该继承。只需创建一个轻量级的自定义控制器来进行数组移位,然后使用本机数组控制器来处理表格显示。
  • 您可以在技术上继承 NSArrayController 并实现自定义键,但有什么意义呢?它只会造成不必要的复杂性。
  • 好吧,你已经让我相信每张桌子一个控制器是明智的(事实上我刚刚设法让这样一个两个控制器系统工作)。您能否阐明如何实现自定义键(如果我有任何其他不正当的想法)?
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2021-06-16
  • 1970-01-01
  • 2021-07-19
  • 2018-04-27
相关资源
最近更新 更多