2012-10-01 2 views
0

NSTextField은 사용자 정의보기에서 중첩되어 있으며 행에서 여러 번 클릭하는 기본 동작 (두 번 클릭, 세 번 클릭 등)을 변경하려고합니다. 텍스트 노드 MindNode의 동작 (아래 이미지 참조).행의 여러 번 클릭에 대한 NSTextField 동작 변경

첫 번째 클릭이 텍스트 입력란을 '활성화'한 다음 처음부터 계속 진행합니다 (이벤트의 클릭 수 재설정).

나는 다음과 같은 아이디어를 가지고,하지만 난을 구현하는 방법을 모르는 그들이 실제로 의미가있는 경우 :

  • 은 어떻게 든 +[NSEvent doubleClickInterval]를 사용하여 시간을 변경하고 두 번째 클릭을 늦출.
  • 프로그래밍 방식으로 클릭 수를 줄입니까?
  • -hitTest:을 사용하여 NSTextField를 선택 취소하고, 클릭 수퍼 뷰로 전달하고, 텍스트 필드의 일부 매개 변수를 변경하고 다음 클릭을 허용합니다. 이 경우 두 번째 클릭의 클릭 수는 여전히 2입니다.
  • -mouseDown:을 무시하고 super를 호출하지 않습니다. 이것은 NSTextField의 선택 기능을 손상시킵니다.

내가 간과 해 본이 쉬운 방법이 있기를 바랍니다.

답변 해 주셔서 감사합니다. 어떤 배경 색상으로 처음 이 Changing the behavior of multiple click for NSTextField

+0

원하는 첫 번째 클릭은 무엇입니까? 왜 당신은 이것을하고 싶습니까? 단지 쓸모없는 클릭 하나를 추가하는 것처럼 보입니다. – rdelmar

+0

실제로 텍스트 필드를 "활성"상태로 만들고있어 정상적인'''NSTextField'''처럼 처리 할 수 ​​있습니다. 또한 시각적 인 일 (그림에서 MindNode의 솔루션과 같은 것)을 수행하지만 문제는 아닙니다. –

+0

MindNode의 첫 번째 클릭/탭은 노드 자체를 선택합니다.즉, 전체 노드의 그래픽 표현에 대한 작업이 수행됩니다 (세 번째 이미지의 두 번째 단계에서 크기 조정 핸들 참고). 다음 클릭은 노드의 필드에 초점을 맞 춥니 다. –

답변

0

: 여기 내 오버레이 클래스에서 사용하고 코드입니다. 하위 클래스의 부울 속성을 사용하여이 특수 동작을 설정 및 해제 할 수 있습니다.

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    if (self.specialBehavior) { 
     theEvent = [NSEvent mouseEventWithType:theEvent.type 
             location:theEvent.locationInWindow 
           modifierFlags:theEvent.modifierFlags 
            timestamp:theEvent.timestamp 
            windowNumber:theEvent.windowNumber 
             context:theEvent.context 
            eventNumber:theEvent.eventNumber 
            clickCount:theEvent.clickCount - 1 
             pressure:theEvent.pressure]; 
    } 

    [super mouseDown:theEvent]; 
} 

이 긴 메서드 호출을 단순화하기 위해, 나는 이벤트의 클릭 수를 감소 NSEvent에 대한 분류 방법을 썼다.

0

내가 텍스트 필드 및 사용자 정의 유형으로 설정 될 것 인 NSBox에서 사용자 지정보기를 내장하여이 작업을 수행 할 것 : 여기

문제의 그래픽 표현입니다 또는 경계 (그래서 그것은 보이지 않을 것이다). 처음에는 사용자 정의보기가 맨 위에 있고 첫 번째 클릭을받을 mouseDown : 메서드가 있습니다. 그 방법에서는 상자의 하위보기를 재정렬하여 텍스트 필드가 맨 위에오고 다음 클릭을받을 수 있습니다. 원한다면 상자는 텍스트 필드보다 약간 클 수 있으므로 텍스트 필드 주위에 사용자 정의 활성화 링처럼 보이는 배경색이나 다른 그림을 그 상자에 줄 수 있습니다. 텍스트 필드의 controlTextDidEndEditing : 메소드에서 시스템을 다시 시작 상태로 재설정 할 수 있으므로 다음에 클릭 할 준비가됩니다. 편집 후

: 나는 NSTextField을 서브 클래스 및 프로그램 마우스 다운 이벤트의 클릭 수를 감소시키는하여 해결 한

@implementation Overlay 

static NSComparisonResult rdComparator(NSView *view1, NSView *view2, void *context) { 
    if ([view1 isKindOfClass:[NSTextField class]]) 
     return NSOrderedDescending; 
    else if ([view2 isKindOfClass:[NSTextField class]]) 
     return NSOrderedAscending; 
    return NSOrderedSame; 
} 


-(void)mouseDown:(NSEvent *)theEvent { 
    self.box.fillColor = [NSColor redColor]; 
    NSView *contentView = self.box.subviews.lastObject; 
    [contentView sortSubviewsUsingFunction:rdComparator context:nil]; 
} 
+0

답변 해 주셔서 감사합니다. 텍스트 필드 앞에 투명한 사용자 정의 뷰를 사용하고이를'''mouseDown :'''에 재정렬하여 구현했습니다. 문제는 두 번째 클릭에는 여전히 클릭 수가 2이고''NSTextField''는 클릭 된 위치에 커서를 놓는 대신 단어를 선택한다는 것입니다. 어떤 생각을 어떻게 바꿀 수 있습니까? –

+0

왜 내가 그 행동을보고 있는지 모르겠지만 내 것은 그렇게하지 않습니다. 한 가지 다른 방법은 applicationDidFinishLaunching 메서드에서 윈도우의 첫 번째 응답자를 오버레이에 설정하는 것이 었습니다. 내 오버레이 코드를 표시하기 위해 내 게시물을 편집했습니다. – rdelmar

+0

나는 당신의 솔루션으로 시도했지만 거의 거기에 있었지만 예상대로 작동하지 않았습니다. 레이어가 백그라운드 일 때 여러 번 클릭하여 레이어의 클릭을 처리하는 데 문제가 있다고 생각합니다. 나는 더 쉬운 해결책을 발견하고 그것을 여기에 올렸다. 다시 말하지만, 귀하의 조언에 감사드립니다. –