2011-03-08 38 views
0

在我的应用程序中,我有一个NSTableView应该包含一个文件列表。我有一个按钮用于打开对话框并以编程方式将文件添加到此列表中。有一段时间,我不能让表视图更新,当我添加文件,因为我用的是下面的代码:从可变数组中更新NSTableView如何在Cocoa中工作?

[self.newPackage.files addObject:fileURL]; 

这对我来说很有意义,现在,这是行不通的。据我了解,上面的代码行将改变可控阵列“在控制器背后”。

我能拼凑出一个可行的解决方案,主要来自this question,用下面的代码:

NSMutableArray *bindingsCompliantArray = [[self valueForKey:@"newPackage"] mutableArrayValueForKey:@"files"]; 
[bindingsCompliantArray addObject:fileURL]; 

不过,我不明白这是如何工作。 bindingsCompliantArray也不会在其他地方使用。我已经看过documentation for mutableArrayValueForKey,但它没有让它更清晰。有没有人可以帮助解释这是如何工作的?

回答

1

‑mutableArrayValueForKey:方法返回一个代理数组,你可以把它看作是原始数组,并且任何KVO观察者观察该数组都可以观察到对数组的更改。

NSController子类如NSArrayController使用键值观察来监视对其观察对象的更改。

当您通过此方法接收代理阵列时,NSMutableArray等方法将被观察者注意到,而使用标准数组则不是这种情况。

+0

我花了一个月才终于觉得我明白了这里发生了什么,但似乎你的答案是现货,尽管对于Cocoa新手(我)来说有点模糊。 http://stackoverflow.com/questions/2293448/what-is-the-kvc-search-pattern-for-mutablearrayvalueforkey/2294715#2294715和http://stackoverflow.com/questions/302365/observing-an-nsmutablearray- for-insertion-removal/304143#304143也有助于我理解这是如何工作的。 – 2011-04-21 22:51:39

0

您正在使用addObject方法更新数组,我认为麻烦仍然存在。尝试通过使用新值设置NEW数组来更新它。它应该工作! = D

祝你好运!

+0

实际上,我的问题中的第二个代码片段确实有效。我更想知道为什么或如何运作。 – 2011-03-10 14:56:43