我创建了一个自定义NSTableViewHeader
。一切正常,但是我找不到一种简单的方法来获取当前列的"键"以检查是否应该绘制排序指示器。
在这里,要检查排序指标的核心代码:
// Check if we need to draw a sort descriptor
for (NSInteger priority = 0; priority < self.tableView.sortDescriptors.count; ++priority) {
NSSortDescriptor *sortDesciptor = self.tableView.sortDescriptors[priority];
if ([sortDesciptor.key isEqualTo:???????]) {
[tableHeaderCell drawSortIndicatorWithFrame:rect inView:self ascending:sortDesciptor.ascending priority:priority];
}
}
要查看上下文中的所有内容,这里是整个drawRect
代码:
- (void)drawRect:(NSRect)dirtyRect
{
[NSGraphicsContext saveGraphicsState];
// Fill the background
[_backgroundColor setFill];
const CGRect headerRect = CGRectMake(0.0, 1.0, self.bounds.size.width, self.bounds.size.height-1.0);
[[NSBezierPath bezierPathWithRect:headerRect] fill];
// Draw separators and column header text.
for (NSUInteger i = 0; i < self.tableView.numberOfColumns; ++i) {
NSRect rect = [self headerRectOfColumn:i];
if (i != 0) {
[[NSColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.35] setFill];
[[NSBezierPath bezierPathWithRect:NSMakeRect(rect.origin.x, rect.origin.y+4.0, 1.0, rect.size.height-8.0)] fill];
}
NSTableColumn *tableColumn = self.tableView.tableColumns[i];
NSTableHeaderCell *tableHeaderCell = tableColumn.headerCell;
NSString *columnText = tableHeaderCell.stringValue;
[columnText drawInRect:NSInsetRect(rect, 5.0, 4.0) withAttributes:_headerTextAttributes];
// Check if we need to draw a sort indicator
for (NSInteger priority = 0; priority < self.tableView.sortDescriptors.count; ++priority) {
NSSortDescriptor *sortDesciptor = self.tableView.sortDescriptors[priority];
if ([sortDesciptor.key isEqualTo:tableColumn.key]) {
[tableHeaderCell drawSortIndicatorWithFrame:rect inView:self ascending:sortDesciptor.ascending priority:priority];
}
}
}
[NSGraphicsContext restoreGraphicsState];
}
我如何找到当前列的"键"以检查是否应绘制排序指示器?
对我有用的唯一方法是检查NSTableColumn
的绑定。这对我有用,因为我使用NSArrayController
。我的NSTableView
使用基于单元格的布局,每个NSTableColumn
都绑定到arrangedObjects.xxx
密钥路径。
// Check if we need to draw a sort descriptor
for (NSInteger priority = 0; priority < self.tableView.sortDescriptors.count; ++priority) {
NSSortDescriptor *sortDesciptor = self.tableView.sortDescriptors[priority];
NSDictionary *bindingInfo = [tableColumn infoForBinding:@"value"];
NSString *keyPath = bindingInfo[NSObservedKeyPathKey];
keyPath = [keyPath stringByReplacingOccurrencesOfString:@"arrangedObjects." withString:@""];
if ([sortDesciptor.key isEqualTo:keyPath]) {
[tableHeaderCell drawSortIndicatorWithFrame:rect inView:self ascending:sortDesciptor.ascending priority:priority];
}
}
但这对基于视图的表不起作用。这真的是唯一的解决方案吗?