2016-11-28 11 views
0

기본적으로 사용자 정의 버튼을 작성했습니다. 사용자 정의 버튼은 NSView 서브 클래스입니다. 버튼은 mouseDown()에서 반응하며 선택기/동작을 실행해야합니다.사용자 정의 클래스의 선택자

대상 및 작업 변수를 하위 클래스에 추가하는 방법을 모르겠습니다 (NSButton과 같은 사용자 인터페이스 요소와 유사). 시도 했음

var target : AnyObject? 
var action: Selector? 

또한 하위 클래스의 대상과 함께 선택기를 실행하려면 어떻게해야합니까?

+2

이 질문은 매우 광범위하며 해결하려는 모든 문제에 대한 잘못된 해결책 일 수 있습니다. 만약 당신이 * 자신의 버튼을 굴려야한다면 * NSControl을 하위 클래스 화하는 것이 더 좋다. NSButton을 올바르게 설정하는 것이 더 좋습니다. – par

+0

@par이 질문에 대해서는 광범위한 내용이 없습니다. OP에는 사용자 정의 클래스에 대한 대상 및 조치 특성이 있습니다. 질문은 대상에서 동작을 호출하는 방법을 묻는 것입니다. – rmaddy

+0

@rmaddy하지만이 질문에 대한 대답은 포함되어 있지 않습니다. OP의 질문에 대답합니다. 빈센트는'IBOutlet's를 사용하는 솔루션을 제안하고 클로저와 완전히 다른 아키텍처 접근법을 추천합니다. 이러한 유형의 광범위한 대답은 너무 광범위한 질문의 직접적인 결과입니다. – par

답변

5

"대상/행동"쌍은 구식이며 피해야합니다. 그러나 실제로 사용하고 싶다면 NSApplication sendAction(_:to:from:) 메소드를 살펴보십시오.

또는 사용자 정의 버튼이 NSControl 인 경우 해당 targetaction 속성과 sendAction(_:to:) 메소드를 사용할 수 있습니다.

더 현대적인 접근 방식은 버튼 클래스에 클로저 속성을 제공 한 다음 대상/액션 쌍을 사용하는 대신 해당 클로저를 호출하는 것입니다. 클로저를 사용하는 것이 더 안전하고 깨끗하며, 아마도 버튼 클래스의 클라이언트 코드를 작성하기가 더 쉽습니다.

+0

타겟/액션이 고풍이라고 생각하게 만드는 이유는 무엇입니까? 이 패턴은 iOS/OS X의 거의 모든 컨트롤을 뒷받침하며, 대상/액션이 본질적으로 변형 인 위임 패턴은 다양한 목적을 위해 여전히 매우 적절한 API 선택입니다. 클로저는 자신의 단점을 가지고 있습니다. (대부분의 사람들은''약한 자아 ''를 사용할 때 매우 혼란스러워합니다.). 당신의 대답은 분명히 뒷받침되는 근거 나 동기가없는 "가장 최신의 것"에 찬성하여 검증되고 진실 된 원칙을 던지려고하는 것처럼 보입니다. – par

+1

@par 대상/행동에는 유형 안전이 없습니다. 액션에 임의의 매개 변수를 지원하는 간단한 방법은 없습니다. Cocoa의 타겟/액션은 블록이 있기 훨씬 전에 Objective-C로 작성되었습니다. 당시 유일한 접근 방식이었습니다. 클로저/블록은 더 많은 유연성과 유형을 안전하게 제공합니다. 그리고 대부분의 경우 훨씬 더 깨끗합니다. – rmaddy

+1

@par 그리고 선택기를 잘못 사용하는 문제로 인해 스택 오버플로에 대한 "인식 할 수없는 선택기"질문이 많이 있습니다. – rmaddy