2011-11-21 2 views
4

다음 코드를 사용하여 NSTextView의 선택을 취소하려면 here을 제안합니다. 불행하게도 전혀 아무 일도 일어나지 않습니다. 디버깅을 시도했지만 모든 것이 제대로 작동하는 것 같지만 NSTextView에는 영향을주지 않습니다.NSTextView의 텍스트를 프로그래밍 방식으로 선택 취소 하시겠습니까?

코드 :

// Sets the scrolling bounds and behavior. This might be useful, but I don't know 
[[textView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)]; 
[[textView textContainer] setWidthTracksTextView:FALSE]; 

// The code for deselecting, beginning by making sure it is actually selected (for testing only, as strange as it is) 

[textView setSelectable:TRUE]; 
[textView setDelegate:self]; 
[_window makeFirstResponder:textView]; 

NSText *fieldEditor = [_window fieldEditor:TRUE forObject:textView]; 
[fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length],0)]; 
[fieldEditor setNeedsDisplay:YES]; 

이 작동하지 않는 이유에 대해 어떤 아이디어? 나는 문자열 값과 같은 다른 것들을 조작 할 수 있기 때문에 콘센트가 올바르게 설정되었다고 확신한다.

+2

코코아-DEV (I 가정) 스레드가 NSText *이 필드 *하지 NSText *보기에 관한 것입니다 * 그. 두 가지가 매우 다릅니다. NSTextField는 일종의 컨트롤이므로 필드 편집기에 종속적 인 반면 NSTextView는 컨트롤이 아니며 필드 편집기를 사용하지 않습니다. –

+0

나는 심지어 알지도 못했다. 고마워. – Justin

답변

-2
[textView setDelegate:self]; 

대리인 메서드 중 하나가 발생하지 않도록하는 느낌이 있습니다. "선택 관리"에서 documentation을 참조하십시오.

+0

어떻게 그렇게?'가 지정되었습니다. – Justin

6

NSTextViews에서 필드 편집기를 사용하고 있는지 확실하지 않습니다. 직접 텍스트보기에서 메서드를 호출 해 보았습니까?

[textView setSelectedRange:NSMakeRange(textView.string.length, 0)]; 

범위 위치를 조정하여 커서를 시작 또는 끝으로 이동할 수 있습니다. 이 메서드를 호출하기 전에 실제로 무언가가 선택되었는지 확인해야 할 수도 있습니다.

편집 : 당신은 그냥 첫 번째로 반응을 사임 할 같이 귀하의 코멘트에서

들린다. 수동으로 호출 할 수 있습니다. [textView.window makeFirstResponder:nil];

+1

텍스트보기는 필드 편집기를 사용하지 않습니다. 텍스트 필드 (및 콤보 상자와 같은 유사한 컨트롤) 만 수행합니다. –

+0

그게 내가 생각한거야. 저스틴이 NSTextField를 사용하지 않으면 위의 코드가 작동해야합니다. –

+0

아무 것도하지 않습니다. 선택을 취소 할 다른 방법이 있습니까? 그건 그렇고, 그것은 NSTextView입니다, 그래서 당신이 옳았어요. – Justin

-2

임시 솔루션으로 누군가가 더 좋은 아이디어를 내놓을 때까지 setHidden:을 사용할 수 있습니다. 나는 이것이 권장 된만큼 효율적이지 않다고 확신하지만, NSTextView을 선택 해제합니다.

간단하게 두 번 전환, 그래서 같은 :

[textView setHidden:TRUE]; 
[textView setHidden:FALSE]; 
5

이 거의 나를 위해 일한;

[textView.window makeFirstResponder:nil]; 

그러나 첫 번째 응답자를 nil로 설정하는 데 문제가있었습니다. 다른보기로 설정하면 원하는대로 할 수 있습니다.

[textView.window makeFirstResponder:[textView superview]]; 

10.7 라이온으로 테스트되었습니다.

+0

감사합니다. 그것은 중요한 시점에서 나를 도왔다. – Sid

2

나는이 방법을 사용했는데 그것은 완벽하게 작동합니다 : 이전 setSelectedRange:는하지만 트릭을 할 것입니다 제안

[textView setSelectedRange:NSMakeRange(0, 0)]; 
2

으로!

목표가 선택과 커서도 완전히 제거하는 것이라면 f.e. NSTextEdit는이 같은 비슷한 동작을 지원하기 위해 NSTextView를 서브 클래스 경우 firstResponder 상태 변경의 경우에 당신이 작성해야 :

- (BOOL)resignFirstResponder 
{ 
    // Invalid range location will remove cursor too 
    [self setSelectedRange:NSMakeRange(NSUIntegerMax, 0)]; 
    return YES; 
} 
//------------------------------------------------------------------------------ 

- (BOOL)becomeFirstResponder 
{ 
    [self setSelectedRange:NSMakeRange(0, self.string.length)]; 
    return YES; 
} 
//------------------------------------------------------------------------------