Swift NSTableView-更改GroupRow样式

Swift NSTableView-更改GroupRow样式,swift,xcode,macos,cocoa,nstableview,Swift,Xcode,Macos,Cocoa,Nstableview,我试图模仿MacOS联系人应用程序在我自己的应用程序中对GroupRows所做的操作,但我无法找出或找到任何地方如何摆脱群组行上方和下方的行。我尝试添加自己的自定义NSTableRowView,可以毫无问题地更改背景颜色,但不知道如何去除这些边框 子类NSTableRowView。然后在子类中添加一个属性,如下所示: @interface CustomTableRowView : NSTableRowView @property (nonatomic, assign) BOOL isGrou

我试图模仿MacOS联系人应用程序在我自己的应用程序中对GroupRows所做的操作,但我无法找出或找到任何地方如何摆脱群组行上方和下方的行。我尝试添加自己的自定义NSTableRowView,可以毫无问题地更改背景颜色,但不知道如何去除这些边框


子类NSTableRowView。然后在子类中添加一个属性,如下所示:

@interface CustomTableRowView : NSTableRowView

@property (nonatomic, assign) BOOL isGroupRow;

@end
在子类中重写drawRect:

- (void)drawRect:(NSRect)dirtyRect {
    if (!self.isGroupRow)
        [super drawRect:dirtyRect];
}
然后在tableView:rowViewForRow中,设置isGroupRow:

tableRow.isGroupRow = [self tableView:tableView isGroupRow:row];

这将删除组行的顶部和底部分隔符。对不起,我不知道斯威夫特,但你可以很容易地翻译它。希望有帮助

另外,如果您正确设置了
[self tableView:tableView isGroupRow:row]
,我们可以省略自定义变量
isGroupRow
,而使用内置的
isGroupRowStyle

下面,Swift代码段创建了一个浮动分组样式的表视图行——看起来很像Finder。其中,
isGroupRowStyle
区分普通行和组行<当组行未锚定在表视图顶部时,code>isFloating为真;重写
trackground(in:)
将删除包裹在组行周围的分隔符

class TableRowView: NSTableRowView {

    override func draw(_ dirtyRect: NSRect) {
        guard isGroupRowStyle && isFloating else {
            return super.draw(dirtyRect)
        }

        NSColor.gridColor.setFill()
        dirtyRect.fill()
    }

    override func drawBackground(in dirtyRect: NSRect) {
        // do not draw
    }
}

查看
NSTableRowView
drawSeparatorInRect
,我用我能想到的所有方法尝试了这一点。据我所知,这只适用于非groupRows的分隔符。我可能错了;如果你有它的工作,我很乐意看一看。如果它在
viewFor中不工作(tableColumn:row:
您可以返回属于
NSView
子类的任何内容。因此,使用文本和分隔符的自定义绘图创建您自己的视图。我知道我可以返回NSView的任何子类,但当isGroupRow设置为true时,我会继续得到相同的布局。如果我不返回,则我不会得到组行的行为。)直到下一组行将其移到一边。如果我这样做,拖放组行不会突出显示。你知道吗?