【发布时间】:2016-04-27 13:41:45
【问题描述】:
我有一个 OTP 屏幕,我必须在 4 Diff TextFields 中输入 4 位密码的 OTP,场景是这样的:
- 每个文本字段的最大字符数限制为 1,当用户在文本字段中输入一个字符时,它应该移动到下一个文本字段。
- 当用户单击退格时,它应该返回到上一个文本字段以便进行更改。
我已经管理了高达 70% 的工作,但只有当用户输入所有文本字段时,退格才有效。我正在粘贴我的代码。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// This allows numeric text only, but also backspace for deletes
if (string.length > 0 && ![[NSScanner scannerWithString:string] scanInt:NULL])
return NO;
NSUInteger oldLength = [textField.text length];
NSUInteger replacementLength = [string length];
NSUInteger rangeLength = range.length;
NSUInteger newLength = oldLength - rangeLength + replacementLength;
// This 'tabs' to next field when entering digits
if (newLength == 1) {
if (textField == _pin1)
{
[self performSelector:@selector(setNextResponder:) withObject:_pin2 afterDelay:0];
}
else if (textField ==_pin2)
{
[self performSelector:@selector(setNextResponder:) withObject:_pin3 afterDelay:0];
}
else if (textField == _pin3)
{
[self performSelector:@selector(setNextResponder:) withObject:_pin4 afterDelay:0];
}
}
//this goes to previous field as you backspace through them, so you don't have to tap into them individually
else if (oldLength > 0 && newLength == 0) {
if (textField ==_pin4)
{
[self performSelector:@selector(setNextResponder:) withObject:_pin3 afterDelay:0];
}
else if (textField == _pin3)
{
[self performSelector:@selector(setNextResponder:) withObject:_pin2 afterDelay:0];
}
else if (textField == _pin2)
{
[self performSelector:@selector(setNextResponder:) withObject:_pin1 afterDelay:0];
}
}
return newLength <= 1;
}
- (void)setNextResponder:(UITextField *)nextResponder
{
[nextResponder becomeFirstResponder];
}
工作:
【问题讨论】:
-
密码不应该被屏蔽吗?
标签: ios objective-c uitextfield uitextfielddelegate