16

我正在寻找一种方法来在 NSTableView 中创建类似 iOS 的部分(如在 iTunes 11 - 附加中)。

正如您在屏幕截图中看到的那样,“专辑”是一个部分,“歌曲”是第二个部分。任何帮助,将不胜感激。

谢谢!

在此处输入图像描述

4

4 回答 4

22

我看到这是一个老问题,但答案是使用基于视图的 NSTableView 然后实现 tableView:viewForTableColumn:row:。

这是基于我如何做的代码。它尚未在 Xcode 中编译。

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSTableCellView *cell = nil;
        // get your row from your array of objects.
        // determine if it's a section heading or not.

    SomeClass *someObject = [self.myObjects objectAtIndex:row];

    if (someObject.isSectionHeading) {
        cell = [tableView makeViewWithIdentifier:@"HeaderCell" owner:self];
        cell.textField.objectValue = someObject.headingName;
    } else {
        cell = [tableView makeViewWithIdentifier:@"DataCell" owner:self];
        cell.textField.objectValue = someObject.rowValue;
    }

    return cell;

}

而且 tableView:isGroupRow 会在你的部分标题上放置一个灰色背景

-(BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row {
    BOOL isGroup = NO;
    // Choose some way to set isGroup to YES or NO depending on your records.
    return isGroup;
}

确保在 Interface Builder 中您已将 NSTableCellViews 的标识符设置为“HeaderCell”和“DataCell”。或者使用任何你想要的名字。只要它与您的代码匹配。您可以拥有任意数量的这些单元格。

如果您创建 NSTableCellView 的子类,那么您可以轻松地将自己的文本字段、复选框、图像等添加到视图并相应地设置它们的值。

于 2013-10-09T02:28:57.803 回答
3

如果你想要部分,你基本上必须自己滚动(认识到行 x 应该是一个部分单元格并提供一个部分视图。TwUI有 TUITableView 可以实现这一点(根据我的经验,并大大提高了滚动性能)。

于 2012-12-07T18:55:18.157 回答
2

有一个非常好的和简单的教程展示了如何NSTableView在 github 上使用示例代码来实现 with 部分。只需在此处观看,在视频说明中就有下载代码的链接。

于 2014-05-07T19:58:16.297 回答
0

我相信这些天来处理这个问题的正确方法是实现表视图委托方法tableView(rowViewForRow:)。如果您检测到指定的行不是标题,则只需返回 nil。否则,该过程类似于为特定表的行和列创建视图。例如,如果您将所有行数据存储在Any调用的单个数组中tableRows,并通过使用该数组中的不同类来确定标题和普通行之间的区别,它可能看起来像这样:

override func viewDidLoad() {
    super.viewDidLoad()
    let headerNib = NSNib(nibNamed: "HeaderRow", bundle: nil)
    tableView.register(headerNib, forIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SectionHeader"))
}

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
    guard let headerData = tableRows[row] as? SectionHeader else { return nil }
    let header = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SectionHeader"), owner: nil) as? HeaderRow
    header?.titleLabel.stringValue = headerData.title
    return header
}

请注意,这只适用于您的表是基于视图的!

于 2019-03-20T08:44:14.903 回答