2017-02-01 46 views
0

我有一個基於視圖的NSTableView,每行有一個NSTrackerArea。 NSTableView包含用戶列表,並且在用戶加入和離開時更新。這是我如何製作一個新單元格:如何在TableCellViews中處理/處理舊的NSTrackingAreas?

 let cell = tableView.make(withIdentifier: "username", 
     owner: self) as! NSTableCellView 

     let aera = NSTrackingArea.init(rect: cell.bounds, options [ 
     NSTrackingAreaOptions.activeInKeyWindow, 
     NSTrackingAreaOptions.inVisibleRect, 
     NSTrackingAreaOptions.mouseEnteredAndExited], 
     owner: self, userInfo: nil) 

     cell.textField?.stringValue = name 
     cell.addTrackingArea(aera) 
     return cell 

跟蹤區域工作正常,但它實現了多層跟蹤區域。

示例:聊天室中有10個用戶,用戶2離開。新用戶加入並在tableview中獲取一行。但是現在這個ViewCell有兩個跟蹤器,彼此重疊。這會產生一些問題。

甚至更​​糟糕的是,當我使用.reloadData()時,會爲所有行創建一個新的跟蹤器。我試圖使用.updateTrackingAreas()和子類NSTableCellView刪除跟蹤器在deinit,但niether工程。我也試圖爲每一行創建跟蹤器,而不是直接在單元格中執行,但我沒有能力將其脫落。

你有什麼想法嗎?並提前致謝!

回答

0

如果您每個單元只使用一個跟蹤區域,那麼您可以做的是確保您只在沒有現有跟蹤區域時添加跟蹤區域。你可以通過檢查你的cell.trackingAreas數組來查看它是否爲空。在代碼中,它應該看起來像這樣:

let cell = NSTableCellView.init() 

if cell.trackingAreas.count == 0 { 
    let trackingArea = NSTrackingArea.init(rect: cell.bounds, options: [.activeInKeyWindow, .inVisibleRect, .mouseEnteredAndExited], owner: self, userInfo: nil) 

    cell.addTrackingArea(trackingArea) 
} 

cell.textField.stringValue = name 

return cell