2013-01-17 28 views
2

我想從一個自定義值自動完成的UITextField

自動完成文本字段已經研究了谷歌和SO這裏UITextField Autocomplete - iPhone SDK

我嘗試這樣做:

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

    if ([string isEqualToString:@"Fac"]) { 
     _clientField.text = @"Factory"; 
    } 

    return YES; 
} 

問題是我沒有得到任何預測值輸入Factory,只是輸入值Fac

編輯

試過此基礎上的答案...

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

if ([string isEqualToString:@"Fac"]) { 
    _clientField.text = [_clientField.text stringByReplacingCharactersInRange:range 
                withString:@"Factory"]; 
    } 

    return NO; 
} 

還是一樣

回答

2

我檢查了您的示例代碼和文本字段的委託未設置。

您可以在您的視圖控制器使用

_clientField.delegate = self; 

另外,你需要使用一個稍微不同的方法來獲取該用戶看到的文本設置。這樣的事情:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *currentString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    if ([currentString isEqualToString:@"Fac"]) { 
     textField.text = @"Factory"; 
     return NO; 
    } 
    return YES; 
} 

請注意,您可能想微調一下,因爲它例如,當用戶刪除文本時也會自動完成。但這應該讓你走上正軌。

+0

謝謝!,已經這麼多年了!最後排序! – JSA986

2

你應該試圖NSLogstring它總是返回的最後一個字符的用戶輸入(除非你複製/粘貼一個字符串:在這種情況下你的代碼工作)。

其實,做你想要做什麼,因爲它似乎就沒有那麼簡單。 這裏是我想出了:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSLog(@"string: %@", string); 

    NSString *currentText = textField.text; 
    NSString *nextText = [currentText stringByAppendingString:string]; 

    if ([nextText isEqualToString:@"Fac"]) 
    { 
     textField.text = @"Factory"; 
     return NO; 
    } 
    return YES; 
} 

如果不建立nextText自己,那麼自動完成的將被延遲。如果你只檢查的TextField.text的例如價值,並且您鍵入「FAC」建成後,將出現在下一個字符輸入。
當你自動完成,你必須NO還這麼不添加string返回在文本字段的末尾場(F - >發 - > Factoryc,你不希望出現這種情況)。所以你說textField不應該改變範圍內的字符......而你自己改變textField的值。

希望這將幫助你瞭解這是怎麼回事這個UITextFieldDelegate方法。

+0

+1。這是做到這一點的方法。 – iDev

+1

只追加字符串是不正確的,因爲用戶可能會在不同的地方插入字符。您需要替換字符串中的給定範圍。 – Alfonso

+0

@frenetischapplaudierend你是對的。我沒有想到這一點。 – florian

1

您也可以看看這個控件(NHAutoCompleteTextField)。在給定鏈接的示例源代碼中,您將看到搜索列表過濾器作爲用戶類型。

NHAutoCompleteTextField易於集成:

#import "NHMainHeader.h" 

autoCompleteTextField = [[NHAutoCompleteTextField alloc] initWithFrame:CGRectMake(x, y, width, 18)]; // 18 - example height 
[autoCompleteTextField setDropDownDirection:NHDropDownDirectionDown]; 
[autoCompleteTextField setDataSourceDelegate:self]; 
[autoCompleteTextField setDataFilterDelegate:self]; 

和靈活的做定製根據自己的需要。例如,根據您在此處需要創建單元格:

- (UITableViewCell *)autoCompleteTextBox:(NHAutoCompleteTextField *)autoCompleteTextBox cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

} 

對於給定的下拉方向可以調整。

typedef enum 
{ 
    NHDropDownDirectionUp, 
    NHDropDownDirectionDown 

} NHDropDownDirection; 

該控件還提供了一些很好的擴展功能,這些功能也將有助於處理其他用戶界面。

#import "UIView+NHExtension.h" 
#import "UILabel+Boldify.h"