当我快速向上或向下滚动或通过tableView.reloadData()刷新数据时,标签和图像更大胆,更加大量加载。 我的代码很简单如下:
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
let cell = tableView.makeViewWithIdentifier("customCell", owner: self) as! NSTableCellView
let infos:Info = dataSource[row] as Info
let nameLabel:NSTextField = NSTextField()
nameLabel.bordered = false
nameLabel.editable = false
nameLabel.stringValue = infos.name
nameLabel.textColor = NSColor.darkGrayColor()
cell.addSubview(nameLabel)
let imageView:NSImageView = NSImageView()
imageView.image = infos.icon
cell.addSubview(imageView)
return cell
}
答案 0 :(得分:0)
表视图使用单元格reuse queue来提高性能,尤其是当它们包含大量行时。这与UITableView在iOS上的工作方式类似,如果您熟悉它。
简而言之:当您滚动表视图时,移动到屏幕外的行的视图不会被释放,而是放入“重用队列”以供日后使用。当您调用makeViewWithIdentifier(_:owner:)
函数时,NSTableView首先检查此队列中是否可以重用的视图:如果它包含any,则该函数将返回其中一个;如果没有,它将创建一个新视图并返回该视图。
我怀疑这里的问题是您要将子视图添加到tableView(_:viewForTableColumn:row:)
中的单元格视图,每次设置新行时都会执行该视图。由于您要添加子视图的单元格会被重复使用,因此每当新行滚动到视图中时,您都会向其添加另一个标签和图像视图,该视图堆叠在前一个上面,并创建您描述的粗体效果。
如果您在Interface Builder中设计单元格,则可以将文本字段和图像视图添加到原型单元格,并将NSTableCellView的imageView
和textField
出口连接到这些视图,以便您可以访问它们在tableView(_:viewForTableColumn:row:)