2017-02-01 17 views
0

私は各行にNSTrackerAreaを持つビューベースのNSTableViewを持っています。 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が離席しています。新しいユーザーが参加し、テーブルビューで行を取得します。しかし、このViewCellには2つのトラッカーがあり、それぞれが重なっています。これはいくつかの問題を引き起こす。

さらに悪いことに、.reloadData()を使用すると、すべての行に対して新しいトラッカーが作成されます。私は.updateTrackingAreas()を使い、NSTableCellViewをサブクラス化してdeinitでトラッカーを削除しようとしましたが、nietherは動作します。私はまた、セル内で直接行うのではなく、各行のトラッカーを作成しようとしましたが、それを取り除くスキルはありませんでした。

ご意見はありますか?事前に感謝します!

答えて

0

セルあたり1つのトラッキングエリアしか使用していない場合は、既存のトラッキングエリアがないときにトラッキングエリアを追加するだけです。 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 
関連する問題