【发布时间】:2009-12-08 06:32:12
【问题描述】:
我正在开发一个应用程序,我在其中以编程方式创建一些 UITextField,并且我在 UITextField 中最多允许 1 个字符。
这是完美的工作。
但写完字符后,用户必须再次点击下一个UITextField 才能显示键盘
输入 1 个字符后,光标应自动移至下一个 UITextField。
我该怎么做?
【问题讨论】:
标签: iphone objective-c ios uitextfield
我正在开发一个应用程序,我在其中以编程方式创建一些 UITextField,并且我在 UITextField 中最多允许 1 个字符。
这是完美的工作。
但写完字符后,用户必须再次点击下一个UITextField 才能显示键盘
输入 1 个字符后,光标应自动移至下一个 UITextField。
我该怎么做?
【问题讨论】:
标签: iphone objective-c ios uitextfield
赶上通知您您的文本字段已更改的代表。检查新长度是否为 1。如果是,请在下一个字段上调用 becomeFirstResponder。
【讨论】:
[textField becomeFirstResponder]
我找到了这种方法..
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if(textField == textField1)
{
if (textField1.text.length > 0 && range.length == 0 )
{
return NO;
}
else {
[textField1 setText:newString];
[textField2 becomeFirstResponder];
return YES;
}
}
else if(textField == textField2)
{
if (textField2.text.length > 0 && range.length == 0 )
{
return NO;
}else {
[textField2 setText:newString];
[textField3 becomeFirstResponder];
return YES;
}
}
}
我们可以用另一种方式来做... 在 viewDidLoad 和那个方法中声明这一行。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endEditingTextField:) name:@"UITextFieldTextDidChangeNotification" object:txtfield1];
- (void) endEditingTextField:(NSNotification *)note {
if ([[txtfield1 text] length] > 0)
{
[txtfield1 resignFirstResponder];
[txtfield2 becomeFirstResponder];
}
}
希望这会有所帮助...
【讨论】:
上述解决方案无效。这个解决方案对我有用:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if(firstCodeField == textField){
[firstCodeField setText:newString];
[secondCodeField becomeFirstResponder];
}
if(secondCodeField == textField){
[secondCodeField setText:newString];
[thirdCodeField becomeFirstResponder];
}
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 1) ? NO : YES;
}
【讨论】:
这可以通过 3 个简单的步骤完成:
在代码中:
if ([currentTextFieldWithCursor canResignFirstResponder]) [currentTextFieldWithCursor resignFirstResponder];
UITextField *followingTextField = // just get it!
if ([followingTextField canBecomeFirstResponder]) [followingTextField becomeFirstResponder];
希望对你有帮助。
【讨论】:
设置一下
UITextFieldDelegate
并在您的 .m 文件中使用此方法。它适用于 OTP 文本框。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if(_txt1 == textField){
if ([_txt1.text length] == 0) {
[_txt1 setText:newString];
[_txt2 becomeFirstResponder ];
}
}
if(_txt2 == textField){
if ([_txt2.text length] == 0) {
[_txt2 setText:newString];
[_txt3 becomeFirstResponder];
}
}
if(_txt3 == textField){
if ([_txt3.text length] == 0) {
[_txt3 setText:newString];
[_txt4 becomeFirstResponder];
}
}
if(_txt4 == textField){
if ([_txt4.text length] == 0) {
[_txt4 setText:newString];
}
}
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 1 && newLength == 2) ? NO : YES;
}
希望这对任何人都有效。 :)
【讨论】:
你必须使用
[textField'sName becomeFirstResponder];
【讨论】: