2011-03-02 36 views
7

這個問題似乎很直接,但我已經嘗試了所有我能想到的,並且Google搜索幾個小時。如何在自動完成時使NSSearchField發送操作?

我有一個NSSearchField,它自動完成,基本上覆制蘋果的SearchField sample code。我在IB中關閉了「發送整個搜索字符串」,因爲我不想在用戶完成文本輸入之前進行搜索,也不想執行多次搜索(它們很昂貴)。

當用戶在字段中鍵入內容時,當他們按Enter鍵,指定他們接受當前的自動完成時,我想要觸發NSSearchField的操作。相反,它似乎只是填充自動完成功能,然後用戶必須再次按下輸入鍵才能觸發該操作。基本上,考慮開始在Safari中鍵入一個URL,它會自動完成,並按Enter鍵開始加載頁面(觸發操作)。他們不需要再次按下輸入來開始加載頁面。

事情我已經嘗試沒有成功:

  • 控制:TextView的:commandSelector :,尋找insertNewline :.當它們按下時,它不會被觸發輸入以完成自動完成
  • 覆蓋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?

相關問題