9

我在 NSTableView 中有两个列作为名称和工资,具有 5-10 个值。单击两个列的标题后,我想对这些列进行排序。互联网上有很多数据,但我无法使用这些数据。请帮助我在可可中做到这一点。

在此先感谢并感谢任何帮助。

4

4 回答 4

17

每个表列都有一个方法setSortDescriptorPrototype 排序描述符是告诉数组如何对自身进行排序(升序、降序、忽略大小写等)的方法。遍历您希望可排序的每一列,并在每一列上调用此方法,然后传递所需的排序描述符(在我的情况下,我将使用列标识符)

for (NSTableColumn *tableColumn in tableView.tableColumns ) {

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:tableColumn.identifier ascending:YES selector:@selector(compare:)];
    [tableColumn setSortDescriptorPrototype:sortDescriptor];
}

写完这段初始化代码后,NSTableViewDataSource有一个方法- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors会在排序描述符发生变化时通知你,在数据源中实现这个方法并向数据数组发送消息以对其进行排序

- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
{
    self.data = [self.data sortedArrayUsingDescriptors:sortDescriptors];
    [aTableView reloadData];
}

每次单击列标题时都会触发此方法,并NSTableColumn显示一个漂亮的小三角形来显示排序顺序。

于 2012-06-29T08:35:14.593 回答
7

我在寻找实现类似功能的最简单方法时偶然发现了这个问题。虽然最初的问题很老,但我希望有人觉得我的回答有用!请注意,我使用的是 Xcode 5.1.1

好的,为此,您需要:

  1. 选择要在表中排序的实际列。
  2. 在属性检查器中,您需要填写两个字段:排序键和选择器。
  3. 在排序键字段中,您需要输入标识符的值。您的标识符的值位于您的身份检查器中。
  4. 在 Selector 字段中,您需要根据列中的对象类型输入合适的选择器方法。默认方法是;相比:

基于 Mac 的 Table View Programming Guide。compare: 方法适用于 NSString、NSDate 和 NSNumber 对象。如果您的表列仅包含字符串,您可能需要考虑使用 caseInsensitiveCompare: 方法,如果区分大小写不重要。但是,请考虑将这些方法签名替换为localizedCompare: 或localizedCaseInsensitiveCompare: 方法以考虑用户的语言要求。

最后,您需要在 Table View Controller 中声明 tableView:sortDescriptorsDidChange: 方法,格式如下所示:

-(void)tableView:(NSTableView *)mtableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
{
    [listArray sortUsingDescriptors: [mtableView sortDescriptors]];
    [tableView reloadData];
}
于 2014-06-05T12:41:55.317 回答
0

Just had lately the same issue to get tableView sorted. My approach :

  • bind your sortDescriptors to tableview's arrayController
  • bind tableview's sortDescriptors to Arraycontroller's sort descriptor
  • perform the settings in attribute inspector (see Tosin's answer above)

Worked perfect for me. No need to set prototypes for columns or something else.

于 2020-08-28T08:46:27.253 回答
0

非常感谢,这对我的问题很有用。我的代码是这样的

首先,在XIB界面中设置唯一值,比如name...

- (void)viewDidLoad {
    [super viewDidLoad];
        self.itemTableView.dataSource = self;
        self.itemTableView.delegate = self;
        self.itemTableView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleRegular;
        self.itemTableView.usesAlternatingRowBackgroundColors = YES;

        for (NSTableColumn *tableColumn in self.itemTableView.tableColumns ) {
            NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:tableColumn.identifier ascending:NO selector:@selector(compare:)];
        [tableColumn setSortDescriptorPrototype:sortDescriptor];
        }
}

-(void)tableView:(NSTableView *)tableView sortDescriptorsDidChange:(NSArray<NSSortDescriptor *> *)oldDescriptors{
    NSLog(@"sortDescriptorsDidChange:%@",oldDescriptors);

    [self.itemArr sortUsingDescriptors:[tableView sortDescriptors]];

    [self.itemTableView reloadData];
}
于 2021-01-16T14:49:03.190 回答