在通过控制器添加新对象之前,NSTableView不会填充数组对象

时间:2013-11-03 19:12:51

标签: objective-c arrays cocoa nstableview cocoa-bindings

我使用可可绑定设置了如此处所示的NSTableView和数组控制器:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/PopulatingViewTablesWithBindings/PopulatingView-TablesWithBindings.html#//apple_ref/doc/uid/10000026i-CH13-SW3

在我的app delegate applicationDidFinishLaunching中,我在这里有以下片段,初始化数组并用对象填充

array = [[NSMutableArray alloc] init];

SomeObject* foo = [[Object alloc] init];
foo.text = @"sup";
[array addObject:foo]; //Repeat this a few times

然而,当我构建应用程序并运行它时,我最终得到一个空表。但是,如果我将一个按钮绑定到数组控制器的add:input并在运行时单击它(这会向数组和表中添加一个新对象),那么表将首先显示新对象,并在applicationDidFinishLaunching之后添加对象。

为什么会这样?有没有办法让我的表填充而不必先添加元素?

3 个答案:

答案 0 :(得分:0)

NSArrayController不跟踪对可变数组的更改,只是更改它正在观察的array属性。所以你要做的是:

NSMutableArray  *mutableArray = [[NSMutableArray alloc] init];

SomeObject* foo = [[Object alloc] init];
foo.text = @"sup";
[mutableArray addObject:foo]; //Repeat this a few times

array=mutableArray;

阵列控制器将array更改为已填充的数组。

答案 1 :(得分:0)

事实证明,我应该:

  1. 将数组控制器作为属性链接到我的应用代理
  2. 将对象添加到阵列控制器本身
  3. 这是我的app delegate.h:

    @property (copy) NSMutableArray *pastes;
    @property (assign) IBOutlet NSArrayController *controller;
    

    和我的app delegate.m:

    @synthesize pastes, controller;
    
     - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        pastes = [[NSMutableArray alloc] init];
    
        [controller addText:@"sup"];
        [controller addText:@"hey"];
        [controller addText:@"hi"];
    }
    

答案 2 :(得分:0)

我希望您已将表列绑定到数组控制器。因此,您只需要获取字典,然后将该值设置为表列的键,然后将该字典添加到可变数组中,然后设置可变数组。并且还在windowDidLoad或awakeFromNib方法中包含此代码。