2012-02-06 50 views
1

更改文本我跟着雷Wenderlich的文本自動完成此教程:http://www.raywenderlich.com/336/how-to-auto-complete-with-custom-values自動完成使用的UITextView應該在範圍

而且它的偉大工程,但只允許搜索包含在TextView的字符串。我需要它在同一視圖中搜索多個字符串。例如:

Hi @user, how's @steve 

應搜索兩個出現的@。這裏是原代碼:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range 
replacementString:(NSString *)string { 
autocompleteTableView.hidden = NO; 

    NSString *substring = [NSString stringWithString:textField.text]; 
    substring = [substring stringByReplacingCharactersInRange:range withString:string]; 
    [self searchAutocompleteEntriesWithSubstring:substring]; 
    return YES; 
} 

這裏是我的:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range 
replacementString:(NSString *)string { 

NSArray* items = [textView.text componentsSeparatedByString:@"@"]; 

if([items count] > 0 && [[items lastObject] length]){ 
    NSString *substring = [NSString stringWithString:[items lastObject]]; 
    [self searchAutocompleteEntriesWithSubstring:substring]; 

    } 
return YES; 
} 

,一切工作,但它似乎是一個字符後面。因此輸入「J」將不會導致任何結果,但「Jo」將返回「J」的結果。我認爲它必須做的:

[substring stringByReplacingCharactersInRange:range withString:string] 

但我嘗試任何崩潰與NSRange越界。

回答

4

首先,我們是在談論一個文本字段還是一個文本視圖?他們是不同的!你的代碼引用了兩者。因爲這是該方法的名稱,所以我將與textField一起去。

當您收到textField:shouldChangeCharactersInRange:replacementString:時,textField.text尚未更改爲包含替換字符串。所以當用戶輸入「J」時,textField.text還沒有包含J

Ray的方法通過執行替換來處理這個問題。當您嘗試進行替換時,它會失敗,因爲您的substring變量不包含textField.text的副本。您的substring只包含textField.text的一部分。這就是爲什麼你會遇到越界異常 - 你的範圍超出範圍,因爲substringtextField.text短。

所以也許你應該在分割字符串之前執行替換。試試這個:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *changedText = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    NSArray* items = [changedText componentsSeparatedByString:@"@"]; 

    if([items count] > 0 && [[items lastObject] length]){ 
     NSString *substring = [NSString stringWithString:[items lastObject]]; 
     [self searchAutocompleteEntriesWithSubstring:substring]; 

    } 
    return YES; 

} 
+0

工程就像一個魅力。甚至沒有考慮過事前做替換。還修復了我的數組大小。謝謝! – 2012-02-06 13:39:36