3

我在不同 XIB 中定义的两个窗口中显示一个 NSArrayController 的内容时遇到了一些问题。

在我的主窗口中(在 MainMenu.xib 中),我有一个 NSTableView 绑定到 NSArrayController

在我的第二个 XIB 中,我有另一个包含 NSTableView 的窗口。我创建了一个新的 NSArrayController,并将表绑定到该 NSArrayController 的内容。

两个 NSArrayController 都绑定到完全相同的 NSArray。

一开始一切都很好,但问题是如果在主窗口中使用 NSArrayController 将对象添加到数组中,则辅助窗口的数据视图不会更新。这很可能是因为它不知道自己需要更新自己,因为它的 NSArrayController 没有用于添加新对象。

我想做的是在两个窗口中使用完全相同的 NSArrayController 实例。这样,如果将对象添加到数组中,两个视图都将收到更改通知。

问题是我无法弄清楚如何在 Interface Builder 中执行此操作。我无法将 NSArrayController 绑定到另一个 NSArrayController(我收到一个运行时错误,表明它只能绑定到 NSArray)。将 NSArrayController 连接到 File's Owner 的 NSArrayController 成员也无济于事,因为这只会清除我希望它使用的 NSArrayController。

我想我可以自己在代码中设置绑定,但如果可能的话,使用 Interface Builder 似乎会更好。有没有办法在 Interface Builder 中做到这一点,或者可能有更好的方法来一起设置?

更新:针对 Chuck 的回答和评论,我尝试了以下操作: - 将我的 NSTableView 的表格内容绑定到 NSArrayController 成员的排列对象(如果我使用 NSArrayController 本身,日志中出现错误:“[NSArrayController count] : unrecognized selector sent to instance") - 将表中的每一列绑定到文件的所有者,模型键路径为 arrayController.arrangedObjects.propertyName

这仍然没有导致表的内容得到更新。我认为这是因为我绑定到 NSArrayController 的排列对象,而不是绑定到 NSArrayController 本身。但是,如果我直接绑定到 NSArrayController,那会给我带来错误。

通常,我会从“绑定到”组合框中选择我的 NSArrayController,使用排列对象作为控制器键,并将属性本身作为模型键路径。我不确定在这种情况下如何做同样的事情——如果可以的话。

我在上面的过程中做错了吗?

4

4 回答 4

1

我能想到的最好的选择是NSArrayController通过调用它来通知第二个它正在管理的数组已经改变rearrangeObjects:。这看起来很笨拙,但它确实有效。

于 2009-01-27T18:48:47.220 回答
1

如何在 IB 中将它们设置为代理对象,然后在代码中实例化实际的对象,也许在您的应用程序委托中?

于 2009-01-27T18:51:21.757 回答
1

添加数组时,您可以通过 KVO 让两个 NSArrayControllers 更新。诀窍是您必须以符合 KVO 的方式观察并添加到数组中。

您需要一些拥有该数组的对象,我们称其为“模型”。数组必须是对象上的键,我们称键为“contentArray”。接下来,当您添加/删除时,您应该首先在“model”上调用 mutableArrayForKey 以获取“contentArray”。然后从数组中添加/删除应该可以工作,例如:

Controller1 绑定到 self.model.contentArray

Controller2 绑定到 self.model.contentArray

//this method is on the "model" object
-(void)addContent(id content)
{
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
    [contentArr addObject:content]; //this will trigger KVO notifications
}

或者,您可以像这样手动执行 KVO 通知:

-(void)addContent(id content)
{
    [self willChangeValueForKey:@"contentArray"];
    [m_contentArray addObject:content];
    [self didChangeValueForKey:@"contentArray"];
}
于 2009-06-30T22:22:32.977 回答
0

当您通过另一个数组控制器进行更新时,没有理由让两个数组控制器不更新一个视图。如果它没有发生,听起来您的 KVO 通知在某处丢失了。很可能您正在直接编辑一个数组(add:也许是在 NSArrayController 子类的方法中?)而不发送正确的更改通知。

于 2009-01-19T04:14:21.463 回答