我正在寻找一种方法来在 NSTableView 中创建类似 iOS 的部分(如在 iTunes 11 - 附加中)。
正如您在屏幕截图中看到的那样,“专辑”是一个部分,“歌曲”是第二个部分。任何帮助,将不胜感激。
谢谢!
我正在寻找一种方法来在 NSTableView 中创建类似 iOS 的部分(如在 iTunes 11 - 附加中)。
正如您在屏幕截图中看到的那样,“专辑”是一个部分,“歌曲”是第二个部分。任何帮助,将不胜感激。
谢谢!
我看到这是一个老问题,但答案是使用基于视图的 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 的子类,那么您可以轻松地将自己的文本字段、复选框、图像等添加到视图并相应地设置它们的值。
如果你想要部分,你基本上必须自己滚动(认识到行 x 应该是一个部分单元格并提供一个部分视图。TwUI有 TUITableView 可以实现这一点(根据我的经验,并大大提高了滚动性能)。
有一个非常好的和简单的教程展示了如何NSTableView
在 github 上使用示例代码来实现 with 部分。只需在此处观看,在视频说明中就有下载代码的链接。
我相信这些天来处理这个问题的正确方法是实现表视图委托方法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
}
请注意,这只适用于您的表是基于视图的!