NSTableView排序绑定 - 编程解决方案

时间:2015-04-24 16:19:26

标签: objective-c macos cocoa nstableview nsarraycontroller

网站上的首次提问者。我一直试图通过从故事板中取出绑定并尝试在代码中重现效果来了解更多关于与NSArrayController相关的NSTableView绑定。我能够使用绑定配置NSTableView和NSArrayController的初始排序顺序,但是我仍然无法在单击它们时对列进行排序。

背景是我在故事板中有一个基于单元格的标准NSTableView,它通过IBOutlet绑定到NSViewController。 NSViewController具有以下viewDidLoad方法:

 //if key is pressed down = true
 document.body.addEventListener("keydown", function (e) {
    keys[e.keyCode] = true;
 });
 //if key is not pressed = false
 document.body.addEventListener("keyup", function (e) {
keys[e.keyCode] = false;
 });


 window.addEventListener("load", function () {
game_loop();
 });

这导致一个成功加载的屏幕,表视图按" namel"排序。数据和每个列标题显示为可点击,每次点击时向上/向下瞄准箭头。

但是,排序顺序没有改变......

阅读各种其他文章和stackoverflow问题我看到的答案如"你只需要将列绑定到数组控制器,NSTableView将自动绑定自己"以及经常涉及故事板的各种其他解释。

我尝试过各种评论下面代码组件的组合。我已经尝试更改每列中sortDescriptorPrototypes的文本。

我知道我错过了一条重要的线索,关于这方面的文件很糟糕。谁能看到我做错了什么?如何正确绑定它以便单击列标题实际上对数据进行排序?

1 个答案:

答案 0 :(得分:4)

因此,这些事情很常见,我自己找到了答案。所以对于那些将来的人,请阅读以下内容:

我的问题是我在NSArrayController和NSTableView之间连接了太多的绑定。我的问题中的绑定是:

a)2个表视图列将它们的值绑定到数组控制器的内容

b)表视图还将其内容绑定到数组控制器

c)表视图将它的选择索引绑定到数组控制器

d)数组控制器将它的排序描述符绑定到表视图排序描述符的本地引用。

我删除了绑定b和c,一切都开始工作了。我以为我之前尝试过,但是当我尝试它时,肯定会有一个额外的错误。下面是我的viewDidLoad方法的功能副本:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //setup the array controller
    self.arrayController = [NSArrayController new];

    [self.arrayController addObject:@{@"namef": @"Test1", @"namel": @"a"}];
    [self.arrayController addObject:@{@"namef": @"Test2", @"namel": @"b"}];
    [self.arrayController addObject:@{@"namef": @"Test3", @"namel": @"c"}];
    [self.arrayController addObject:@{@"namef": @"Test4", @"namel": @"B"}];

    //setup the table view
    [[self.tableView tableColumnWithIdentifier:@"0"] bind:NSValueBinding toObject:self.arrayController withKeyPath:@"arrangedObjects.namef" options:nil];
    [[self.tableView tableColumnWithIdentifier:@"0"] setSortDescriptorPrototype:[NSSortDescriptor sortDescriptorWithKey:@"namef" ascending:YES selector:@selector(caseInsensitiveCompare:)]];

    [[self.tableView tableColumnWithIdentifier:@"1"] bind:NSValueBinding toObject:self.arrayController withKeyPath:@"arrangedObjects.namel" options:nil];
    [[self.tableView tableColumnWithIdentifier:@"1"] setSortDescriptorPrototype:[NSSortDescriptor sortDescriptorWithKey:@"namel" ascending:YES selector:@selector(caseInsensitiveCompare:)]];

    //setup sorting
    [self.tableView setSortDescriptors:[NSArray arrayWithObject: [[NSSortDescriptor alloc] initWithKey:@"namel" ascending:YES selector:@selector(caseInsensitiveCompare:)]]];
    [self.arrayController bind:NSSortDescriptorsBinding toObject:self.tableView withKeyPath:@"sortDescriptors" options:nil];
    [self.arrayController setAutomaticallyRearrangesObjects:YES];

}