2011-03-02 3 views
7

이 질문은 간단 해 보이지만 나는 생각할 수있는 모든 것을 시도했고 몇 시간 동안 봤습니다.NSSearchField가 자동 완성시 동작을 보내도록 만드는 방법은 무엇입니까?

기본적으로 Apple의 SearchField sample code을 복사하는 자동 완성 기능이있는 NSSearchField가 있습니다. 사용자가 텍스트 입력을 완료 할 때까지 검색을 원하지 않기 때문에 IB에서 "전체 검색 문자열 보내기"를 해제했으며 여러 검색 (비싸다)을하고 싶지 않습니다.

사용자가 필드에 입력 할 때 Enter 키를 누를 때 현재 자동 완성을 수락한다는 것을 지정하면 NSSearchField에 대한 작업을 실행하고 싶습니다. 대신 자동 완성을 채우는 것처럼 보이기 때문에 사용자는 두 번째로 해당 동작을 실행하기 위해 enter 키를 눌러야합니다. 기본적으로 Safari에서 URL을 입력하기 시작하면 자동 완성되고 Enter 키를 누르면 페이지 로딩이 시작됩니다 (액션 실행). 페이지 로딩을 시작하기 위해 다시 enter를 누르지 않아도됩니다. insertNewline 찾고 :, commandSelector :. :

  • 컨트롤 : 텍스트 뷰

    것들 내가 성공하지 않고 노력했습니다 Enter를 눌러 자동 완성을 완료하면 해고 당하지 않습니다.

  • controlTextDidEndEditing :을 (를) 재정의합니다. 위와 동일

아이디어가 있으십니까? 감사!

답변

5

이 작업을 수행하는 방법을 알았습니다.

NSTextViews의 NSFieldEditor를 재정의해야합니다.

는 NSWindow 표시의 위임에 재정의 된 버전을 제공하려면

- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client 
{ 
    if ([client isKindOfClass:[NSSearchField class]]) 
    { 
     if (!_mlFieldEditor) 
     { 
      _mlFieldEditor = [[MLFieldEditor alloc] init]; 
      [_mlFieldEditor setFieldEditor:YES]; 
     } 
     return _mlFieldEditor; 
    } 
    return nil; 
} 

_mlFieldEditor는 인스턴스 변수입니다. 정의는 다음과 같습니다.

@interface MLFieldEditor : NSTextView 
@end 

@implementation MLFieldEditor 


- (void)insertCompletion:(NSString *)word forPartialWordRange:(NSRange)charRange movement:(NSInteger)movement isFinal:(BOOL)flag 
{ 
    // suppress completion if user types a space 
    if (movement == NSRightTextMovement) return; 

    // show full replacements 
    if (charRange.location != 0) { 
     charRange.length += charRange.location; 
     charRange.location = 0; 
    } 

    [super insertCompletion:word forPartialWordRange:charRange movement:movement isFinal:flag]; 

    if (movement == NSReturnTextMovement) 
    { 
     [[NSNotificationCenter defaultCenter] postNotificationName:MLSearchFieldAutocompleted object:self userInfo:nil]; 
    } 
} 

@end 

[super insertCompletion ...] 다음에 핵심 부분은 NSReturnTextMovement입니다. How to prevent NSSearchField from overwriting entered strings using the first autocompletion list entry?

: 스페이스 키를 입력하는 것은 내가에 만들었다 코멘트이었다, 자동 완성을 수행하지 않도록

첫 번째 부분은 변경됩니다

관련 문제