如何找到“ nstablecolumn”的键来绘制排序指示器



我创建了一个自定义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];
    }
}

但这对基于视图的表不起作用。这真的是唯一的解决方案吗?

最新更新