以编程方式更新由Cocoa绑定控制的TableView

时间:2013-09-13 04:10:01

标签: cocoa nstableview cocoa-bindings

我对obj-c和cocoa相当新,所以请耐心等待:

我有一个带有cocoa绑定的NSTableView,它可以按照我的nib中的NSArrayController实例提供的简单-add -remove等方法正常工作。我想以编程方式将对象添加到为该控制器提供内容的数组中(因此对于表视图),然后相应地更新视图。

我目前有一个工作方法可以将新对象添加到数组中(由NSLog验证),但我无法弄清楚如何更新表视图。

所以:如何更新绑定的tableview?(即,在我以编程方式将对象添加到我的数组之后)。 我基本上是在使用胶水代码中的[view reloadData]之类的一些视图刷新代码之后,但我希望它能够使用我现有的绑定。

或者是否存在与此问题相关的KVC / KVO解决方案?

代码详情: AppController.h

@interface AppController : NSObject

@property NSMutableArray *clientsArray;

-(IBAction)addClientFooFooey:(id)sender;

@end

AppController.m(注意,我也有这里没有显示的相应的init方法)

@implementation AppController
...

-(IBAction)addClientFooFooey:(id)sender{
    [self.clientsArray addObject:[[Client alloc] initWithFirstName: @"Foo" andLastName:@"Fooey"]];

//Need some code to update NSTableView here

}

@end

Client.h只是简单地定义了两个属性:firstName和lastName。我的mainmenu.nib文件中的NSTableView的2列通过绑定到AppController实例的数组控制器适当地绑定到这些属性。

在旁注/作为替代。我怎样才能在现有的NSArrayController方法-add中添加功能,例如:-addWithFirstName:andLastName并且仍然与绑定兼容?

1 个答案:

答案 0 :(得分:1)

如果您的阵列控制器绑定到clientsArray,则有两个主要选项。

第一种方法是使用数组控制器的addObject:方法,而不是直接将对象添加到clientsArray

另一种方法是保留当前的addClientFooFooey:方法,但用这两行包装现有代码:

[self willChangeValueForKey:@"clientsArray"];

[self didChangeValueForKey@"clientsArray"];

这告诉KVO系统您正在对数组进行更改,以便再次查看它。

第一个选项是最简单的,但如果由于某种原因需要直接更新数组,请让KVO知道你正在这样做。