gpt4 book ai didi

objective-c - NSTableView 排序绑定(bind) - 编程解决方案

转载 作者:行者123 更新时间:2023-12-03 16:54:01 25 4
gpt4 key购买 nike

第一次在网站上提问。我一直在尝试通过从 Storyboard中取出绑定(bind)并尝试在代码中重现效果来了解有关 NSTableView 绑定(bind)与 NSArrayController 的更多信息。我可以使用绑定(bind)配置 NSTableView 和 NSArrayController 的初始排序顺序,但我似乎仍然无法在单击列时对它们进行排序。

背景是我在 Storyboard中有一个标准的、基于单元格的 NSTableView,它通过 IBOutlet 绑定(bind)到 NSViewController。 NSViewController 有以下 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 column bindings and sorting
[[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:)]];

//Bind the array controller to the tableView
[self.tableView bind:NSContentBinding toObject:self.arrayController withKeyPath:@"arrangedObjects" options:nil];
[self.tableView bind:NSSelectionIndexesBinding toObject:self.arrayController withKeyPath:@"selectionIndexes" options:nil];

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

这会导致成功加载屏幕,其中表格 View 按“namel”数据排序,并且每个列标题显示为可单击,每次单击时箭头向上/向下。

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

阅读各种其他文章和 stackoverflow 问题,我看到诸如“您只需将列绑定(bind)到数组 Controller ,NSTableView 将自动绑定(bind)自身”之类的答案以及经常涉及 Storyboard的各种其他解释。

我尝试了注释以下代码的组件的各种组合。我尝试更改每列中 sortDescriptorPrototypes 内部的文本。

我知道我错过了一个重要的线索,并且有关此的文档非常糟糕。谁能看到我做错了什么吗?如何正确绑定(bind),以便单击列标题实际上对数据进行排序?

最佳答案

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

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

a) 2 个 TableView 列将其值绑定(bind)到数组 Controller 的内容

b) TableView 还将其内容绑定(bind)到数组 Controller

c) TableView 将其选择索引绑定(bind)到数组 Controller

d) 数组 Controller 将其排序描述符绑定(bind)到 TableView 排序描述符的本地引用。

我删除了绑定(bind) 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];

}

关于objective-c - NSTableView 排序绑定(bind) - 编程解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29852590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com