2017-02-01 1 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는 퇴장합니다. 새로운 사용자가 조인하고 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 
관련 문제