2016-07-24 63 views
1

我已经登录控制器,其中有两个文本框:变化的UITextField响应

  • 访问卡
  • 密码

最大长度为门禁卡是9和一旦用户键入第九个数字,它应该出现在访问卡字段上,然后光标需要移动到密码字段。

在我的代码中,当用户单击以输入第九个数字但光标未出现并且光标移至密码字段时,光标正在移动。

例如:我想输入“123456789”作为访问卡。当我点击“9”它不会出现,但光标移动到密码字段:

LoginController.swift:

let ACCESSCARD_MAXLENGTH = 9 
let PASSWORD_MAXLENGTH = 12 
var AccessCardtextFieldLength = 0 
var PasswordTextFieldLength = 0 

class LoginViewController: UIViewController , UITextFieldDelegate { 
    @IBOutlet weak var AccessCardTextField: UITextField! 

    @IBOutlet weak var PasswordTextField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // calling the function that initialize textFields 
     initializeTextFields() 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

    } 

    // function is used to initialize textFields 
    func initializeTextFields() { 

     // To set the focus on the access card once the view load. 
     AccessCardTextField.becomeFirstResponder() 


     // This must be defined so we can apply the text field functions on it 
     AccessCardTextField.delegate = self 
     PasswordTextField.delegate = self 


     // Define the keyboard type of the textFields. 
     AccessCardTextField.keyboardType = UIKeyboardType.NumberPad 
     PasswordTextField.keyboardType = UIKeyboardType.ASCIICapable 

    } 


func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 


     AccessCardtextFieldLength = (textField.text?.characters.count)! + string.characters.count 
     PasswordTextFieldLength = (textField.text?.characters.count)! + string.characters.count 
     if (textField == AccessCardTextField){ 
      for i in 0..<ACCESSCARD_MAXLENGTH{ 
       if (AccessCardtextFieldLength == ACCESSCARD_MAXLENGTH){ 
        PasswordTextField.becomeFirstResponder() 
       } 
       else{ 
        return true 
       } 
       return false 
      } 

     } 
     if (textField == PasswordTextField){ 
      return PasswordTextFieldLength <= PASSWORD_MAXLENGTH ? true : false 

     } 

     return true 
    } 
} 
+0

当您添加断点时,您的代码执行了'PasswordTextField.becomeFirstResponder()'吗? – jo3birdtalk

+0

是的,它添加了断点到PasswordTextField.becomeFirstResponder(),但代码没有停止。 –

回答

1

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool当它返回true只会更新。在这种情况下,您正在更改firstResponder,因此它不会更新。

我的建议是对这种情况使用add target。这是你可以做的:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // calling the function that initialize textFields 
    initializeTextFields() 
    accessCardTextField.addTarget(self, action: #selector(LoginViewController.accessCardTextFieldChanged(_:)), forControlEvents: .EditingChanged) 
} 

func accessCardTextFieldChanged(textField: UITextField) { 
    if textField.text?.characters.count == ACCESSCARD_MAXLENGTH { 
     modelTextField.becomeFirstResponder() 
    } 
} 

这样,它可以节省你很多行代码。最重要的是,只有accessCardTextField被更改才会被调用。你可以做另一个功能来分别检查你的密码文本框的长度。另外,我从AccessCardTextField更名为accessCardTextField。建议以小写开头的变量。

+0

你的代码给出了一个错误“不能调用非函数类型UITextField的值” –

+0

对不起,当我用你的变量替换它时,我不小心删除了'.addTarget'。我已经更新了它,试试这个。 –

+0

谢谢@Zack Kwan,它的工作原理是 –

0

不太确定这是否可行,但请尝试编辑您的if语句内容。

if (AccessCardtextFieldLength == ACCESSCARD_MAXLENGTH){ 
     if (textField == AccessCardTextField) { 
      textField.resignFirstResponder() 
      PasswordTextField.becomeFirstResponder() 
    } 
} 
+0

,但它仍然表现相同。 –

0

在这种情况下

if (AccessCardtextFieldLength == ACCESSCARD_MAXLENGTH){ 
    PasswordTextField.becomeFirstResponder() 
    **return true** 
} 
else{ 
    return true 
} 

在返回FLASE这就是为什么它不会显示你的最后一个字符。