2016-02-11 33 views
4
func textFieldDidBeginEditing(textField: UITextField) { 
    scrlView.setContentOffset(CGPointMake(0, textField.frame.origin.y-70), animated: true) 


    if(textField == firstDigit){ 

     textField.becomeFirstResponder() 
     secondDigit.resignFirstResponder() 
    } 


    else if(textField == secondDigit){ 

     textField.becomeFirstResponder() 
     thirdDigit.resignFirstResponder() 
    } 

    else if(textField == thirdDigit){ 
     //textField.becomeFirstResponder() 
     fourthDigit.becomeFirstResponder() 
    } 

對於一次只能輸入一個數字的OTP條目,我使用了四個文本字段。輸入數字後,我需要將光標自動移動到下一個文本框。如何以編程方式在swift ios中自動將光標從一個文本字段移動到另一個文本字段?

回答

12

設置文本框的委託,並添加目標:

override func viewDidLoad() { 
     super.viewDidLoad() 

     first.delegate = self 
     second.delegate = self 
     third.delegate = self 
     fourth.delegate = self 


     first.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
     second.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
     third.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
     fourth.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
    } 

現在,當文本的改變而改變文本框

而最後,當用戶開始編輯文本框清晰

extension ViewController: UITextFieldDelegate{ 
    func textFieldDidBeginEditing(textField: UITextField) { 
     textField.text = "" 
    } 
} 
+0

謝謝。它工作完美@HamzaAnsari –

0

**從調用UITextfieldDelegate函數並使下一個文本字段成爲第一響應者,並且不需要添加targ等並記得設置在viewDidLoad中所有文本字段的代表**

  extension ViewController : UITextFieldDelegate { 


      func textFieldShouldReturn(textField: UITextField) -> Bool { 

       nextTextFieldToFirstResponder(textField) 

       return true; 
      } 




      func nextTextFieldToFirstResponder(textField: UITextField) { 

      if textField == emailTextField 
      { 
       self.firstNameTextField.becomeFirstResponder() 
      } 
      else if textField == firstNameTextField { 

       self.lastNameTextField.becomeFirstResponder() 
      } 

      else if textField == lastNameTextField { 

       self.passwordTextField.becomeFirstResponder() 
      } 

      else if textField == passwordTextField { 

       self.confirmPassTextField.becomeFirstResponder() 
      } 

      else if textField == confirmPassTextField { 
       self.confirmPassTextField.resignFirstResponder() 

      } 

      } 
0

我已經嘗試了許多代碼,最後這雨燕3.0最新[2017年三月]

的「視圖控制器」爲我工作類應繼承「UITextFieldDelegate」以使此代碼正常工作。

class ViewController: UIViewController,UITextFieldDelegate 

添加文本字段與正確的代碼nuber這個標籤號碼是用來採取基於分配給它的增量標籤數量控制到合適的文本字段。

override func viewDidLoad() { 

userNameTextField.delegate = self 

     userNameTextField.tag = 0 

     userNameTextField.returnKeyType = UIReturnKeyType.next 

     passwordTextField.delegate = self 

     passwordTextField.tag = 1 


     passwordTextField.returnKeyType = UIReturnKeyType.go 

} 

在上面的代碼中,「returnKeyType = UIReturnKeyType.next」,其中將鍵盤迴車鍵顯示爲「下一個」你也有其他選擇「加入/去」等,根據您的應用程序更改值。

這種「textFieldShouldReturn」是控制UITextFieldDelegate的方法,並有下一個字段選擇基於標籤值增量

func textFieldShouldReturn(_ textField: UITextField) -> Bool 

    { 

     if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField { 

      nextField.becomeFirstResponder() 

     } else { 

      textField.resignFirstResponder() 

      return true; 

     } 

     return false 

    } 
1

首先我們需要來設置的UITextField標籤在這裏我們;

func textFieldShouldReturnSingle(_ textField: UITextField , newString : String) 
{ 
    let nextTag: Int = textField.tag + 1 

    let nextResponder: UIResponder? = textField.superview?.superview?.viewWithTag(nextTag) 
    textField.text = newString 
    if let nextR = nextResponder 
    { 
     // Found next responder, so set it. 
     nextR.becomeFirstResponder() 
    } 
    else 
    { 
     // Not found, so remove keyboard. 
     textField.resignFirstResponder() 
    } 
} 

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

    let newString = ((textField.text)! as NSString).replacingCharacters(in: range, with: string) 

    let newLength = newString.characters.count 

    if newLength == 1 { 
     textFieldShouldReturnSingle(textField , newString : newString) 
     return false 
    } 

    return true 
} 

注:需要的UITextField只有一個字符,數字格式,這是在OTP格式。

+0

不錯的嘗試,欣賞 –

0

爲SWIFT 3

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){ 
     let nextTag = textField.tag + 1; 

     // get next responder 
     let nextResponder = textField.superview?.viewWithTag(nextTag); 
     textField.text = string; 

     if (nextResponder == nil){ 
      textField.resignFirstResponder() 
     } 
     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; 
} 
0

解決方案對於斯威夫特4

在這個解決方案,你會去到下一個字段。當您按刪除時將出現在前一個文本字段中。

第1步:設置選擇器文本字段

override func viewDidLoad() { 
     super.viewDidLoad() 

     otpTextField1.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged) 
     otpTextField2.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged) 
     otpTextField3.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged) 
     otpTextField4.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged) 

    } 

第2步:現在我們將處理移到下一個文本字段,刪除文本字段。

@objc func textFieldDidChange(textField: UITextField){ 
     let text = textField.text 
     if text?.count == 1 { 
      switch textField{ 
      case otpTextField1: 
       otpTextField2.becomeFirstResponder() 
      case otpTextField2: 
       otpTextField3.becomeFirstResponder() 
      case otpTextField3: 
       otpTextField4.becomeFirstResponder() 
      case otpTextField4: 
       otpTextField4.resignFirstResponder() 
      default: 
       break 
      } 
     } 
     if text?.count == 0 { 
      switch textField{ 
      case otpTextField1: 
       otpTextField1.becomeFirstResponder() 
      case otpTextField2: 
       otpTextField1.becomeFirstResponder() 
      case otpTextField3: 
       otpTextField2.becomeFirstResponder() 
      case otpTextField4: 
       otpTextField3.becomeFirstResponder() 
      default: 
       break 
      } 
     } 
     else{ 

     } 
    } 

重要提示:不要忘記設置代理。

相關問題