2014-12-05 2 views
10

새로운 사용자 정의 NSControl을 개발해야합니다. 내가 찾을 수있는 모든 가이드와 예제 (Apple's Subclassing NSControl 기사 포함)는 NSCell을 기반으로 제작되었습니다. 그러나 NSControl의 모든 셀 관련 메시지는 10.10부터 더 이상 사용되지 않습니다.OS X 10.10의 사용자 정의 NSControl 클래스

그냥 하위 클래스를 만들고 IB의 사용자 정의보기를 통해 프로젝트에 추가했지만, 응답을 허용하고, refusesFirstResponder를 NO로 설정하고, acceptsFirstResponder에서 YES를 반환하지만 컨트롤을받을 수 없습니다. 그리고 거기에있을 것으로 예상되는 많은 기능 (값 변경 알림 등)이 누락되었다고 확신합니다.

컨트롤이 현재 개발되는 방법을 보여주는 새로운 참조가 있습니까? 내 Google-fu는 내게 알려줍니다. 감사!

+0

알아 냈습니까? 나는 똑같은 일을 처리하려고 노력하고있다. 감사. – pizzafilms

+0

아니요, 절대로 - 다른 일을하기 위해 옆으로 치우고 아직 돌아 오지 않았습니다. – starkos

+0

몇 가지 코드를 보여 주시겠습니까? – rocky

답변

1

문제는 실제로 컨트롤을 첫 번째 응답자로 설정하지 않았기 때문일 수 있습니다. 간단히 클릭하면 자동으로 실행되지 않습니다. 다음은 첫 번째 응답자 상태를 받아들이는 빠른 클릭 예입니다 (너무 클릭하면됩니다). 그리고 포커스 링을 그립니다. 제어 기능을 활성화하고 목표와 동작을 설정하십시오.

class MyControl: NSControl { 


    override var acceptsFirstResponder: Bool { 
     return true 
    } 


    override func becomeFirstResponder() -> Bool { 
     return true 
    } 


    override func mouseDown(with event: NSEvent) { 
     window?.makeFirstResponder(self) 
    } 

    override func mouseUp(with event: NSEvent) { 
     if let action = action { 
      NSApp.sendAction(action, to: target, from: self) 
     } 
    } 


    override func draw(_ dirtyRect: NSRect) { 
     NSColor.white.set() 
     NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill() 

     if window?.firstResponder == self { 
      NSColor.keyboardFocusIndicatorColor.set() 
     } else { 
      NSColor.black.set() 
     } 
     NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).stroke() 
    } 


    override var focusRingMaskBounds: NSRect { 
     return bounds.insetBy(dx: 1, dy: 1) 
    } 


    override func drawFocusRingMask() { 
     NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill() 
    } 

} 
+0

NSControl을 서브 클래 싱하기위한 현대적인 참조에 관한 제 질문은 여전히 ​​의미합니다. 애플이 업데이트 된 기사를 발표했다면 나는 아직 우연히 발견하지 못했다. 처음 응답자에게 : 나는 그 코드를 남기고 다른 접근법을 취했다. 그리고 나는 너무 오래 전에 기억해야했다. – starkos

+0

NSCell을 제외하면 건물 제어가 훨씬 간단 해집니다 *. 컨트롤은 사용자 입력 이벤트를 처리하는 다른 뷰와 완전히 다르지 않습니다. 과거에는 NSCell을 이벤트 및 디스플레이의 기본 메커니즘으로 사용하여 테이블 뷰 등에서 작업 할 수있었습니다. 이제 NSCell이 죽었으므로 간단합니다. NSView/NSResponder에서 사용할 수있는 것을 사용하십시오./NSControl APIs. 새로운 가이드가 실제로 무엇을 제공하는지 확신 할 수 없습니다. – seth