2011-06-19 32 views
2

我遇到問題觸發complete: NSTextfield的方法。NSTextField的自動完成方法

現在我可以使用@distinctUnionOfObjects(真棒方法刪除數組的重複)從一個文本字段名稱的不同陣列,現在我可以使用回送自動完成該文本字段:
- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index

但此方法不是自動的,我必須按ESC按鈕在數據輸入過程中彈出文本字段的自動填充建議。

我在這裏搜索,發現一些例子,對我來說沒有任何意義。

簡短的問題: 是否有使用NSTexfields代表controlDidChanged或類似的東西這個更容易,更清晰地做任何的方法?

我只是混淆了使用complete:方法nstextview。

回答

3

當您的文本字段委託人獲得controlTextDidChange:時,您可以撥打Field Editor上的complete:。這是按ESC或F5時被調用的方法。

- (void) controlTextDidChange: (NSNotification *)note { 
    NSTextView * fieldEditor = [[note userInfo] objectForKey:@"NSFieldEditor"]; 

    [fieldEditor complete:nil]; 
} 

棘手的部分是,在航行完成菜單時,會引起再次發送controlTextDidChange:消息,(雖然不改變實際的字符串),這將創建一個無限循環。當您已經完成時,您需要某種標誌來阻止complete:被呼叫。例如,您可以跟蹤用戶對字符串的最後更改並將其與字段編輯器的當前值進行比較;如果沒有用戶發起的變化,不會引起完成:

BOOL textDidNotChange = [lastTypedString isEqualToString:[fieldEditor string]]; 

if(textDidNotChange){ 
    return; 
} 
else { 
    lastTypedString = [[fieldEditor string] copy]; 
    [fieldEditor complete]; 
} 
+0

@Josh Caswell,...你認爲這是做出這個非常簡單的請求的聰明方式嗎? – Prooshani

+1

@Prooshani:我不明白你的意見。你認爲我描述的程序太複雜了? –

+0

@Josh Caswell,不,我的朋友,我只是試圖告訴你我之前讀過這個技巧,我認爲這是xcode的一個弱點,它使我能夠很簡單地處理其他語言的簡單請求。 另外,你可以想象我有22個Textfields,並且必須爲他們做這個! 現在,你認爲這是來自Xcode的智能方法嗎? 注意:我以前在蘋果的文檔中讀過這個技巧。 – Prooshani

8

我不建議複製整個字符串。對於你的情況,這可能會很好,但是如果你使用自動完成來處理大型文本文件,那麼你會遇到各種各樣的性能和內存問題。您可以跟蹤是否處於更新中。如果你有多個textview,你可以爲isCompleting變量創建一個字典。

- (void) controlTextDidChange: (NSNotification *)note { 
    NSTextView * fieldEditor = [[note userInfo] objectForKey:@"NSFieldEditor"]; 

    if (!isCompleting) { 
     isCompleting = YES; 
     [fieldEditor complete:nil]; 
     isCompleting = NO; 
    } 
}