在 iOS 中的 UITextField 中允许单个数字 [英] Allowing single digit in UITextField in iOS
问题描述
我有一个Verification ViewController
,我通过短信获得了4位数的验证码,我需要输入这些验证码才能登录,我已经像这样创建了ViewController
>
正如你所看到的四个 UITextField
,我只需要为每个 UITextField
允许一个数字,
我尝试过的:我试图使用 shouldChangeCharactersInRange:method:
,但它没有被调用,我不知道出了什么问题,我想是因为 UITextField
s在 UITableView
中,所以它不工作.
你可以通过使用文本域的委托功能来像这样改变文本域.最初,您需要设置每个文本字段的委托和标签.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{if ((textField.text.length >= 1) && (string.length > 0)){NSInteger nextTag = textField.tag + 1;//尝试寻找下一个响应者UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];如果 (!nextResponder)nextResponder = [textField.superview viewWithTag:1];如果(下一个响应者)//找到下一个响应者,所以设置它.[nextResponder 成为FirstResponder];返回否;}返回是;}
Swift 2
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) ->布尔{//在文本字段中输入值if (textField.text?.characters.count < 1 && string.characters.count > 0){让 nextTag = textField.tag + 1;//获取下一个响应者var nextResponder = textField.superview?.viewWithTag(nextTag);if (nextResponder == nil){nextResponder = textField.superview?.viewWithTag(1);}textField.text = 字符串;nextResponder?.becomeFirstResponder();返回假;}else if (textField.text?.characters.count >= 1 && string.characters.count == 0){//从文本字段中删除值让previousTag = textField.tag - 1;//获取下一个响应者var previousResponder = textField.superview?.viewWithTag(previousTag);if (previousResponder == nil){previousResponder = textField.superview?.viewWithTag(1);}textField.text = "";previousResponder?.becomeFirstResponder();返回假;}返回真;}
Swift 4
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) ->布尔{如果 textField.text!.count <1 &&string.count >0{让 nextTag = textField.tag + 1//获取下一个响应者var nextResponder = textField.superview?.viewWithTag(nextTag)if (nextResponder == nil){nextResponder = textField.superview?.viewWithTag(1)}textField.text = 字符串nextResponder?.becomeFirstResponder()返回假}否则如果 textField.text!.count >= 1 &&string.count == 0{//从文本字段中删除值让 previousTag = textField.tag - 1//获取下一个响应者var previousResponder = textField.superview?.viewWithTag(previousTag)if (previousResponder == nil){previousResponder = textField.superview?.viewWithTag(1)}textField.text = ""previousResponder?.becomeFirstResponder()返回假}返回真}
I have a Verification ViewController
, I get 4 digit verification code by SMS and I need to enter those code to login, I have created the ViewController
like this
As you can see four UITextField
s, I need to allow only single digit for each UITextField
,
What I tried: I was trying to use shouldChangeCharactersInRange:method:
, but its not getting called, I don't know what's wrong, I think because UITextField
s are in UITableView
so it is not working.
You can change the text field like this by using the delegate function of the text field. Initially, you need to set the delegate and the tag of each text field.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ((textField.text.length >= 1) && (string.length > 0))
{
NSInteger nextTag = textField.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
if (! nextResponder)
nextResponder = [textField.superview viewWithTag:1];
if (nextResponder)
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
return NO;
}
return YES;
}
Swift 2
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
// On inputing value to textfield
if (textField.text?.characters.count < 1 && string.characters.count > 0){
let nextTag = textField.tag + 1;
// get next responder
var nextResponder = textField.superview?.viewWithTag(nextTag);
if (nextResponder == nil){
nextResponder = textField.superview?.viewWithTag(1);
}
textField.text = string;
nextResponder?.becomeFirstResponder();
return false;
}
else if (textField.text?.characters.count >= 1 && string.characters.count == 0){
// on deleting value from Textfield
let previousTag = textField.tag - 1;
// get next responder
var previousResponder = textField.superview?.viewWithTag(previousTag);
if (previousResponder == nil){
previousResponder = textField.superview?.viewWithTag(1);
}
textField.text = "";
previousResponder?.becomeFirstResponder();
return false;
}
return true;
}
Swift 4
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField.text!.count < 1 && string.count > 0{
let nextTag = textField.tag + 1
// get next responder
var nextResponder = textField.superview?.viewWithTag(nextTag)
if (nextResponder == nil){
nextResponder = textField.superview?.viewWithTag(1)
}
textField.text = string
nextResponder?.becomeFirstResponder()
return false
}
else if textField.text!.count >= 1 && string.count == 0{
// on deleting value from Textfield
let previousTag = textField.tag - 1
// get next responder
var previousResponder = textField.superview?.viewWithTag(previousTag)
if (previousResponder == nil){
previousResponder = textField.superview?.viewWithTag(1)
}
textField.text = ""
previousResponder?.becomeFirstResponder()
return false
}
return true
}
这篇关于在 iOS 中的 UITextField 中允许单个数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!