我在 NSTableView 中有两个列作为名称和工资,具有 5-10 个值。单击两个列的标题后,我想对这些列进行排序。互联网上有很多数据,但我无法使用这些数据。请帮助我在可可中做到这一点。
在此先感谢并感谢任何帮助。
我在 NSTableView 中有两个列作为名称和工资,具有 5-10 个值。单击两个列的标题后,我想对这些列进行排序。互联网上有很多数据,但我无法使用这些数据。请帮助我在可可中做到这一点。
在此先感谢并感谢任何帮助。
每个表列都有一个方法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
显示一个漂亮的小三角形来显示排序顺序。
我在寻找实现类似功能的最简单方法时偶然发现了这个问题。虽然最初的问题很老,但我希望有人觉得我的回答有用!请注意,我使用的是 Xcode 5.1.1
好的,为此,您需要:
基于 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];
}
Just had lately the same issue to get tableView sorted. My approach :
Worked perfect for me. No need to set prototypes for columns or something else.
非常感谢,这对我的问题很有用。我的代码是这样的
首先,在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];
}