2012-09-10 47 views
1

它是有一個解決方案,以擁有的NSTextField與方法完成:的NSTextField完成

- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(int*)index 

與幾個單詞,而不是一個?因爲當你鍵入一個空格,完成重新開始...

謝謝。

+0

真的很抱歉,我不知道這個操作 –

回答

3

優於從不遲到,這可能對他人有所幫助:

這是一個有點棘手的問題,因爲NSControlTextEditingDelegate/NSTextFieldDelegate不提供一種方法來直接解決這個問題。你需要做的是創造NSTextView自定義子類(是的,文字視圖),並覆蓋方法- (NSRange)rangeForUserCompletion

- (NSRange)rangeForUserCompletion 
{ 
    return [self selectedRange]; 
} 

然後子類NSTextFieldCell要覆蓋的方法- (NSTextView *)fieldEditorForView:

- (NSTextView *)fieldEditorForView:(NSView *)aControlView 
{ 
    static MyTextView* _myFieldEditor = nil; 
    if (_myFieldEditor == nil) { 
     _myFieldEditor = [[MyTextView alloc] init]; 
     [_myFieldEditor setFieldEditor:YES]; 
    } 
    return _myFieldEditor; 
} 

然後在Interface Builder中,將文本字段單元格的類設置爲NSTextFieldCell的子類。會發生什麼情況是當您的文本字段成爲第一響應者時,該窗口將調用您的單元格-fieldEditorForView:方法,並將您的自定義文本視圖用作字段編輯器。因此,在編輯文本字段的值時,任何完成都會在您的文本視圖上調用-(NSRange)rangeForUserCompletion

然後你可以微調你的-rangeForUserCompletion,使它返回你想要完成的確切範圍。

此外,在fieldEditorForView:的代碼假定您的應用程序使用只有一個窗口,如果你正在使用多個窗口(例如基於文檔的應用程序),你就必須改變它,保持一個字段編輯器實例每窗口

希望它能幫助:)

+0

感謝這個答案,一直在努力來解決這個了一會兒。有關信息,可以使用以下內容進行微調--rangeForUserCompletion以允許多個單詞 NSRange range = [super rangeForUserCompletion]; range.location = 0; range.length = [[self string] length]; 返回範圍; – nicktones