Cocoa:NSTableView 单元格中的标签重复加载数据

Cocoa:NSTableView repeated loading data the label in cell

随着我快速上下滚动或按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
}

快照是这样的:

Table 视图使用单元格 reuse queue 来提高它们的性能,尤其是当它们包含很多行时。这类似于 UITableView 在 iOS 上的工作方式(如果您熟悉的话)。

简而言之:当您滚动 table 视图时,移动到屏幕外的行的视图不会被释放,而是放入 'reuse queue' 以备后用。当您调用 makeViewWithIdentifier(_:owner:) 函数时,NSTableView 首先检查此队列以查找它可以重用的视图:如果它包含任何视图,该函数将 return 其中一个给您;如果没有,它会创建一个新视图 return 那。

我怀疑这里的问题是您将子视图添加到 tableView(_:viewForTableColumn:row:) 中的单元格视图,每次设置新行时都会执行该操作。由于要向其添加子视图的单元格被重复使用,因此每次新行滚动到视图中时,您都会向其添加另一个标签和图像视图,这些标签和图像视图堆叠在前一个标签之上并创建您描述的粗体效果。

如果您在 Interface Builder 中设计单元格,您可以将文本字段和图像视图添加到原型单元格并连接 NSTableCellView 的 imageViewtextField 插座访问这些视图,以便您可以在 tableView(_:viewForTableColumn:row:)

中访问它们