2017-02-26 2 views
2

NSButton을 뷰로, NSMenuItem을 주 메뉴로 가지는 NSToolbarItem이 있습니다. 두 가지 모두 동일한 작업을 수행하며, 첫 번째 응답자에게 보내지는 것이지 특정 대상에는 보내지 않습니다. 이 메서드는 궁극적으로 NSSplitViewController의 하위 클래스에서 구현됩니다. NSSplitViewController는 창의 내용보기의 뷰 계층 구조 어딘가에 있습니다. 두 항목의 유효성을 검사하고 싶지만 해당 컨트롤러에 로컬 인 일부 조건에 의존하기 때문에 특정 분할 뷰 컨트롤러에서 유효성 검사를 수행해야합니다.관련 컨트롤러의 NSToolbarItem 유효성 확인

분할보기 컨트롤러에서 validateToolbarItem(_:)validateMenuItem(_:)을 오버로드했습니다. 메뉴 항목의 경우 예상대로 작동합니다. 메서드가 호출되고 유효성 검사가 수행됩니다. 그러나 validateToolbarItem(_:)은 호출되지 않습니다.

Apple’s documentation에 따르면 NSToolbar는보기 기반 도구 모음 항목에 validateToolbarItem(_:)을 보내지 않습니다. 이를 테스트하기 위해 도구 모음 항목을 이미지 도구 모음 항목으로 대체했으며 예상대로 작동합니다.

이 점을 근거로 몇 가지 해결책을 찾아 왔지만, 내가 원하는 것은 아닙니다.

  • 하위 클래스 NSToolbarItem 및 override validate(). 그러나 컨트롤러의 validateToolbarItem(_:)을 호출하는 방법에 대한 지침은 제공되지 않습니다.

  • 하위 클래스 NSToolbar와 validateVisibleToolbarItems()을 재정의 한 다음 첫 번째 응답자에게 메시지를 보냅니다. 이 문제는 도구 모음의 응답자 체인 외부에 있기 때문에 분할보기 컨트롤러에 메시지를 보낼 수 없다는 문제가 있습니다.

  • 위와 같이 서브 클래스 NSToolbar를 사용하지만 NSWindowController와 같이 응답 체인에있는 컨트롤러에 validateToolbarItem(_:)을 구현하십시오. 이 작동하지만 그 다음 메뉴 항목에 필요하지 않은 것을 처리하기 위해 추가 코드를 추가해야합니다.

이미지 툴바 항목 및 메뉴 항목처럼 효과가있는 우아한 해결책이 있습니까?

답변

2

단추에 대한 내 NSToolbarItem 하위 클래스에 다음 코드를 작성했습니다. 이 toolbarItem 하위 클래스를 사용하면 보통 validateUserInterfaceItem() 또는 validateToolbarItem()을 사용하여 NSControl이 포함 된 툴바 항목의 유효성을 검사 할 수 있습니다.

override func validate() { 

    // validate content view 
    if 
     let control = self.view as? NSControl, 
     let action = self.action, 
     let validator = NSApp.target(forAction: action, to: self.target, from: self) as AnyObject? 
    { 
     switch validator { 
     case let validator as NSUserInterfaceValidations: 
      control.isEnabled = validator.validateUserInterfaceItem(self) 
     default: 
      control.isEnabled = validator.validateToolbarItem(self) 
     } 

    } else { 
     super.validate() 
    } 
} 
+0

내가 찾고있는 환상적인 솔루션. 고마워요! – Eitot

+0

아름다운! 이것을 공유해 주셔서 감사합니다. 두 가지를 설명해 주시겠습니까? 1) 왜 이것이 필요한 이유입니까? 왜 코코아가 이미 이것을하지 않았습니까? 그리고 b) 얼마나 자주 이것이 호출되기를 기대해야 하는가? 코드를 빠르게 구현할 때 예측할 수 없을 정도로 자주 호출되는 것처럼 보입니다. –

+0

@ jeff-h 1) NSToolbarItem의 내부보기는 NSControl 이상일 수 있습니다. 그래서 코코아는 그것이 무엇인지 알지 못하므로 어떻게 검증해야 하는가. 2) 그것은 이벤트 트라이 거와 타이머의 조합입니다. 참조 유효성 검사시기에 대한 자세한 내용은 https://developer.apple.com/reference/appkit/nstoolbar/1516947-validatevisibleitems에서 확인할 수 있습니다. – 1024jp