2017-09-12 12 views
0

내 애플 리케이션의 윈도우는 세 개의 윈도우로 구성된 스플릿 뷰를 가지고 있습니다; 가장 왼쪽 창은보기 기반 개요보기를 호스트합니다.NSWindow.contentView.hittest()가 NSOutlineView의 서브 뷰에 도달하지 않습니다.

개요보기의 아무 곳이나 클릭하면 클릭 한 계층에서 맨 아래의 하위보기를 확인하려고합니다. 즉, 어떤 행, 어떤 셀 및 궁극적으로 어떤 셀의 하위 뷰 (컨트롤)가 클릭되었는지입니다.

mouseDown(with:)을 호스팅보기 컨트롤러에서 덮어 쓰려고 시도했지만 호출되지 않았습니다. 나는 아웃 바운드 뷰가 어떻게 든 이벤트를 호깅하는 것 같아 대신 서브 클래스 자체에서 직접 NSOutlineView 메서드를 재정의하기로 결정했습니다. 이 작동합니다. 그러나, 거기에서 내가 윤곽보다 계층 구조 아래로 더 이상 갈 수 없어 자체를 참조하십시오

클래스 MyOutlineView : NSOutlineView {

override func mouseDown(with event: NSEvent) { 
    if let view = self.window?.contentView?.hitTest(event.locationInWindow) { 
     Swift.print("\(view.className)") 
    } 
} 

... 인쇄 :

인 MyModule을.

MyOutlineView는

hittest()에 대한 설명서를 읽

지정된 점을 포함 (자신을 포함) 뷰 계층의보기의 자손, 또는 전무를 돌려 점에있는 경우 보기 밖에 완전히. 이 메소드는 NSWindow 객체가 주로 으로 사용하여 어떤 뷰가 마우스 다운 이벤트를 수신해야하는지 결정합니다. 이 메소드를 호출 할 필요는 거의 없지만 은 뷰 객체가 서브 뷰에서 마우스 다운 이벤트 을 숨기도록하기 위해이를 대체하려고 할 수 있습니다. 이 메서드는 숨겨진 뷰를 무시합니다.

개요보기의 최상위 하위보기를 어떻게 테스트 할 수 있습니까?

답변

1

mouseDown(with:)은 컨트롤러가 아닌보기에서 호출됩니다. 일반적으로 개요보기 내부의 컨트롤은 mouseDown을 처리합니다.

그러나 컨트롤을 찾으려면 예, -[NSTableView(NSTableViewRowHeaderSupport) hitTest:]이 문제를 일으킬 수 있습니다. 해결 방법 : 행과 열을 가져 와서 셀보기를 얻은 다음 셀보기에서 hitTest을 호출하십시오.

override func mouseDown(with event: NSEvent) { 
    let localPoint = self.convert(event.locationInWindow, from: nil) 
    let column = self.column(at: localPoint) 
    let row = self.row(at: localPoint) 
    if column >= 0 && row >= 0 { 
     if let cellView = self.view(atColumn: column, row: row, makeIfNecessary: false) { 
      if let cellSuperViewPoint = cellView.superview?.convert(localPoint, from: self) { 
       if let view = cellView.hitTest(cellSuperViewPoint) { 
        Swift.print("\(view.className)") 
       } 
      } 
     } 
    } 
} 
+0

고맙습니다. 나는 https://instagram.com/p/BY-57nMFUvy/에서 내 개요보기에이 코드를 적용하는 작업을하고 있었다. 링크 된 저장소는 뷰 컨트롤러에서'mouseDown (with :)'를 사용합니다. –

+0

거기에있는 주석에서 제안한 것처럼, 나는 아웃 라인 뷰에서'validateProposedFirstResponder : forEvent :'를 오버라이드하여 특정'NSView' 서브 클래스에 대해'true'를 리턴했다. –

+0

당신은'mouseDown (with :)'와 컨트롤러에 대해 옳았습니다. – Willeke