kri*_*ish 14 objective-c uitableview uitextfield ios swift
我有一个Verification ViewController,我通过短信获得4位数的验证码,我需要输入这些代码登录,我已经创建了ViewController这样的

你可以看到四个UITextField,我需要只允许一个数字UITextField,
我尝试了什么:我试图使用shouldChangeCharactersInRange:method:,但它没有被调用,我不知道什么是错的,我认为因为UITextFields UITableView所以它不起作用.
Anu*_*oni 19
您可以使用文本字段的委托功能更改这样的文本字段.最初,您需要设置每个文本字段的委托和标记.
- (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;
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特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;
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特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
}
Run Code Online (Sandbox Code Playgroud)
Var*_*ria 11
如果您不想使用标记,请使用此代码,并且它比上面更好
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// On inputing value to textfield
if ((textField.text?.characters.count)! < 1 && string.characters.count > 0){
if(textField == txtOne)
{
txtTwo.becomeFirstResponder()
}
if(textField == txtTwo)
{
txtThree.becomeFirstResponder()
}
if(textField == txtThree)
{
txtFour.becomeFirstResponder()
}
textField.text = string
return false
}
else if ((textField.text?.characters.count)! >= 1 && string.characters.count == 0){
// on deleting value from Textfield
if(textField == txtTwo)
{
txtOne.becomeFirstResponder()
}
if(textField == txtThree)
{
txtTwo.becomeFirstResponder()
}
if(textField == txtFour)
{
txtThree.becomeFirstResponder()
}
textField.text = ""
return false
}
else if ((textField.text?.characters.count)! >= 1 )
{
textField.text = string
return false
}
return true
}
Run Code Online (Sandbox Code Playgroud)
雨燕4
\n\n受到 @Anurag Soni 和 @Varun Naharia 答案的启发
\n\n变体A
\n\nextension EnterConfirmationCodeTextField: UITextFieldDelegate {\n\n func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {\n guard let textFieldCount = textField.text?.count else { return false }\n\n // \xd0\xa1losure\n let setValueAndMoveForward = {\n textField.text = string\n let nextTag = textField.tag + 1\n if let nextResponder = textField.superview?.viewWithTag(nextTag) {\n nextResponder.becomeFirstResponder()\n }\n }\n\n // \xd0\xa1losure\n let clearValueAndMoveBack = {\n textField.text = ""\n let previousTag = textField.tag - 1\n if let previousResponder = textField.superview?.viewWithTag(previousTag) {\n previousResponder.becomeFirstResponder()\n }\n }\n\n if textFieldCount < 1 && string.count > 0 {\n\n setValueAndMoveForward()\n\n if textField.tag == 4 {\n print("Do something")\n }\n\n return false\n\n } else if textFieldCount >= 1 && string.count == 0 {\n\n clearValueAndMoveBack()\n return false\n\n } else if textFieldCount >= 1 && string.count > 0 {\n\n let nextTag = self.tag + 1\n if let previousResponder = self.superview?.viewWithTag(nextTag) {\n previousResponder.becomeFirstResponder()\n\n if let activeTextField = previousResponder as? UITextField {\n activeTextField.text = string\n }\n }\n\n return false\n }\n\n return true\n\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n变体 B(另一种行为):
\n\nextension EnterConfirmationCodeTextField: UITextFieldDelegate {\n\n func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {\n guard let textFieldCount = textField.text?.count else { return false }\n\n // \xd0\xa1losure\n let setValueAndMoveForward = {\n textField.text = string\n let nextTag = textField.tag + 1\n if let nextResponder = textField.superview?.viewWithTag(nextTag) {\n nextResponder.becomeFirstResponder()\n }\n }\n\n // \xd0\xa1losure\n let clearValueAndMoveBack = {\n textField.text = ""\n let previousTag = textField.tag - 1\n if let previousResponder = textField.superview?.viewWithTag(previousTag) {\n previousResponder.becomeFirstResponder()\n }\n }\n\n if textFieldCount < 1 && string.count > 0 {\n\n setValueAndMoveForward()\n\n if textField.tag == 4 {\n print("Do something")\n }\n\n return false\n\n } else if textFieldCount >= 1 && string.count == 0 {\n\n clearValueAndMoveBack()\n return false\n\n } else if textFieldCount >= 1 {\n\n setValueAndMoveForward()\n return false\n }\n\n return true\n\n }\n\n }\nRun Code Online (Sandbox Code Playgroud)\n\n另外,我实现了这个功能:
\n\n\n\n在最后一个textFiled为空的情况下,我只想切换到前一个textFiled。我尝试了所有这些方法。但对我来说,下面的方法更优雅,更有魅力:
\n\n变体A
\n\nclass EnterConfirmationCodeTextField: UITextField {\n\n // MARK: Life cycle\n\n override func awakeFromNib() {\n super.awakeFromNib()\n\n delegate = self\n }\n\n // MARK: Methods\n\n override func deleteBackward() {\n super.deleteBackward()\n\n let previousTag = self.tag - 1\n if let previousResponder = self.superview?.viewWithTag(previousTag) {\n previousResponder.becomeFirstResponder()\n\n if let activeTextField = previousResponder as? UITextField {\n if let isEmpty = activeTextField.text?.isEmpty, !isEmpty {\n activeTextField.text = String()\n }\n }\n }\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n变体 B(另一种行为):
\n\nclass EnterConfirmationCodeTextField: UITextField {\n\n // MARK: Life cycle\n\n override func awakeFromNib() {\n super.awakeFromNib()\n\n delegate = self\n }\n\n // MARK: Methods\n\n override func deleteBackward() {\n super.deleteBackward()\n\n let previousTag = self.tag - 1\n if let previousResponder = self.superview?.viewWithTag(previousTag) {\n previousResponder.becomeFirstResponder()\n }\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\nEnterConfirmationCodeTextField为每个文本字段分配并设置适当的tag值。
| 归档时间: |
|
| 查看次数: |
12080 次 |
| 最近记录: |