2015-08-13 57 views
0

當我快速上下滾動或通過tableView.reloadData()刷新數據時,標籤和圖像更加大膽和大膽,它被加載了很多次。 我的代碼很簡單如下:可可:NSTableView重複加載數據單元格中的標籤

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 
} 

這樣的快照: enter image description here

回答

0

表視圖利用細胞reuse queue,使他們更好的性能,特別是當它們含有大量的行。這與UITableView在iOS上的工作方式類似,如果你熟悉的話。

簡而言之:當您滾動表格視圖時,移動到屏幕外的行的視圖不會被解除分配,而是放入「重用隊列」中供以後使用。當你調用makeViewWithIdentifier(_:owner:)函數時,NSTableView首先檢查這個隊列是否可以重用的視圖:如果它包含任何視圖,函數會返回其中的一個給你;如果沒有,它會作出新的看法並返回。

我懷疑這裏的問題是,你要在tableView(_:viewForTableColumn:row:)的單元視圖中添加子視圖,每次設置一個新行時都會執行子視圖。由於要添加子視圖的單元格會被重用,因此每當新行滾動到視圖中時,就會爲其添加另一個標籤和圖像視圖,該視圖堆疊在前一個視圖的頂部,並創建您描述的粗體效果。

如果你設計你的細胞在Interface Builder中,您可以將文本字段和圖像視圖添加到您的原型電池並連接NSTableCellView的imageViewtextField出口這些意見,所以你可以在tableView(_:viewForTableColumn:row:)

訪問它們
相關問題