2010-03-27 2 views
2

대부분의 작업에서 InterfaceBuilder를 클릭하고 드래그하여 일부 인터페이스 객체의 호출을 코드에 "연결"합니다. 예를 들어, 사용자가 테이블에서 행을 한 번 클릭 할 때를 알고 싶으면 표의 동작에서 컨트롤러의 동작으로 연결을 끌어옵니다.일부 액션에 대해서만 setTarget을 호출해야하는 이유는 무엇입니까?

이제 사용자가 행을 두 번 클릭한다고 가정 해 보겠습니다. 이런 일이 생길 때 내 행동 중 하나를 불러주기를 원하면 -[NSTableView setDoubleAction]뿐 아니라 -[NSControl setTarget]과 같이 호출해야합니다. 왜?

인터페이스 빌더가 setDoubleAction을 지원하지 않는 이유를 묻는 질문에 나는 이 아닙니다.입니다. 모든 도구에는 제한이 있습니다. 나는 어떻게 그리고 왜 setTarget이 필요하지 않는지에 대한 더 큰 이해를 얻으려고 노력하고있다. 나는 그 때까지 setDoubleAction을 원한다. 이 질문을하는 또 다른 방법은 다음과 같습니다. 인터페이스 작성기에서 테이블의 (한 번 클릭으로) 작업의 대상을 설정하기 위해 필요한 작업을 수행하는 이유는 무엇입니까?

답변

1

표보기를 IB의 작업에 연결 한 다음 setDoubleAction을 호출하면 setTarget을 추가로 호출 할 필요가 없습니다. 그러나 더블 클릭 메시지 만 받기를 원하며 테이블 뷰를 IB의 작업에 연결하지 않았다면 setTarget으로 전화해야합니다.

표보기는 actiondoubleAction을 동일한 대상에 보냅니다.

@implementation NSTableView 

- (void)theUserClickedOnMe 
{ 
    [self sendAction:[self action] to:[self target]; 
} 

- (void)theUserDoubleClickedOnMe 
{ 
    [self sendAction:[self doubleAction] to:[self target]]; 
} 

@end 

그리고 당신이 IB에서하고있는 것은이 같은 것입니다 : 당신은 다음과 같이 구현되는 것으로 NSTableView는 상상할 수

- (void)userConnectedControl:(NSControl *)control 
     toAction:(SEL)action 
     ofObject:(id)object 
{ 
    [control setTarget:object]; 
    [control setAction:action]; 
} 

실제 구현이 아무데도 가까이,하지만 효율적입니다 무슨 일이야.

1

작업을 두 번 클릭하고 대상을 설정하지 않거나 대상을 nil으로 설정하면 작업 메시지가 응답자 체인을 통과하게됩니다.

작업과 함께 대상을 설정하면 작업 메시지는 해당 개체에만 적용됩니다.

관련 문제