【问题标题】:How to move to previous TextField when delete button is clicked on built-in keyboard iOS在内置键盘iOS上单击删除按钮时如何移动到上一个TextField
【发布时间】:2020-05-26 13:56:55
【问题描述】:

我正在构建一个需要用户输入由 4 位数字组成的 pin 的 iOS 应用程序。因此,我分别创建了 4 个 TextField,以便为每个 TextField 接受一个数字。当用户输入每个文本字段并从文本字段顺利移动到另一个文本字段时,它工作正常。

但问题是我希望用户能够通过单击 iOS 内置键盘提供的清除按钮图标来删除。当用户单击该图标按钮时,它应该让文本字段移动到上一个文本字段,但它对我不起作用。

我在stackoverflow 上找到了很多在线资源,但它仍然不适合我。这就是我创建自己的问题的原因。

这就是我的代码的样子!我以编程方式创建了文本字段!

self.coverView.addSubview(self.paymentView.firstDigit)
self.coverView.addSubview(self.paymentView.secondDigit)
self.coverView.addSubview(self.paymentView.thirdDigit)
self.coverView.addSubview(self.paymentView.fourthDigit)

self.view.addSubview(self.overlayView)
self.overlayView.snp.makeConstraints { (make) in
    make.top.width.height.centerX.equalTo(self.coverView)
}
self.paymentView.firstDigit.becomeFirstResponder()


self.paymentView.firstDigit.snp.makeConstraints { (make) in
    make.top.equalTo(self.coverView)
    make.width.height.equalTo(21)
    make.leading.equalTo(self.coverView)
}
self.paymentView.secondDigit.snp.makeConstraints { (make) in
    make.top.equalTo(self.coverView)
    make.leading.equalTo(self.paymentView.firstDigit.snp.trailing).offset(8)
    make.width.height.equalTo(21)
}
self.paymentView.thirdDigit.snp.makeConstraints { (make) in
    make.top.equalTo(self.coverView)
    make.leading.equalTo(self.paymentView.secondDigit.snp.trailing).offset(8)
    make.width.height.equalTo(21)
}
self.paymentView.fourthDigit.snp.makeConstraints { (make) in
   make.top.equalTo(self.coverView)
    make.leading.equalTo(self.paymentView.thirdDigit.snp.trailing).offset(8)
    make.width.height.equalTo(21)
}

self.paymentView.firstDigit.delegate = self
self.paymentView.secondDigit.delegate = self
self.paymentView.thirdDigit.delegate = self
self.paymentView.fourthDigit.delegate = self 

上面的代码包含了TextField的委托。以下是我为每个 TextField 设置目标的方式

self.paymentView.firstDigit.addTarget(self, action: #selector(textfieldDidChange(textField:)), for: .editingChanged)
self.paymentView.secondDigit.addTarget(self, action: #selector(textfieldDidChange(textField:)), for: .editingChanged)
self.paymentView.thirdDigit.addTarget(self, action: #selector(textfieldDidChange(textField:)), for: .editingChanged)
self.paymentView.fourthDigit.addTarget(self, action: #selector(textfieldDidChange(textField:)), for: .editingChanged)

下面是textfieldDidChange的功能

 @objc func textfieldDidChange(textField: UITextField) {
        let text = textField.text
        print("This is an amount of text ", text?.count)
        if text?.count == 1 {
            switch textField {
            case self.paymentView.firstDigit:
                self.paymentView.firstDigit.textColor = BaseColor.colorPrimary
                self.paymentView.firstDigit.backgroundColor = BaseColor.colorPrimary
                self.paymentView.secondDigit.becomeFirstResponder()

            case self.paymentView.secondDigit:
                self.paymentView.secondDigit.textColor = BaseColor.colorPrimary
                self.paymentView.thirdDigit.becomeFirstResponder()
                self.paymentView.secondDigit.backgroundColor = BaseColor.colorPrimary

            case self.paymentView.thirdDigit:
                self.paymentView.thirdDigit.textColor = BaseColor.colorPrimary
                self.paymentView.fourthDigit.becomeFirstResponder()
                self.paymentView.thirdDigit.backgroundColor = BaseColor.colorPrimary

            case self.paymentView.fourthDigit:
                self.paymentView.fourthDigit.textColor = BaseColor.colorPrimary
                self.paymentView.fourthDigit.backgroundColor = BaseColor.colorPrimary
                self.paymentView.fourthDigit.resignFirstResponder()
                self.view.endEditing(true)
            default:
                break
            }
        }
        if text?.count == 0 {
            switch textField {
            case self.paymentView.firstDigit:
                self.paymentView.firstDigit.becomeFirstResponder()
                self.paymentView.firstDigit.backgroundColor = .red
            case self.paymentView.secondDigit:
                self.paymentView.firstDigit.becomeFirstResponder()
                self.paymentView.firstDigit.backgroundColor = .red
            case self.paymentView.thirdDigit:
                self.paymentView.secondDigit.becomeFirstResponder()
                self.paymentView.secondDigit.backgroundColor = .red
            case self.paymentView.fourthDigit:
                self.paymentView.thirdDigit.becomeFirstResponder()
                self.paymentView.thirdDigit.backgroundColor = .red
            default:
                break
            }
        }
    }

以上是当点击内置键盘iOS的清除按钮但它没有移动时,我试图使文本字段移动到上一个文本字段的方法。而上面的代码是我从源How to move cursor from one text field to another automatically in swift ios programmatically?复制过来的

【问题讨论】:

    标签: ios objective-c swift uitextfield


    【解决方案1】:

    我已经解决了这个问题,只需按照以下步骤操作,您就会根据需要获得结果:

     @IBOutlet weak var txt4: UITextField!
     @IBOutlet weak var txt3: UITextField!
     @IBOutlet weak var txt2: UITextField!
     @IBOutlet weak var txt1: UITextField!
    

    在视图控制器中添加 textField 委托

    在 viewDidLoad 中分配委托:

      txt1.delegate = self
      txt2.delegate = self
      txt3.delegate = self
      txt4.delegate = self
    

    然后添加你想要的代码

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                if (textField == txt1) {
                   txt2.becomeFirstResponder()
                }else if (textField == txt2) {
                   txt3.becomeFirstResponder()
                }else if (textField == txt3) {
                   txt4.becomeFirstResponder()
                }else if (textField == txt4) {
                 //here
    
                var str = self.txt1.text! + self.txt2.text! + self.txt3.text! + self.txt4.text!
                str = str.replacingOccurrences(of: " ", with: "")
                self.verify(otp: str)
                         //  self.navigationController?.pushViewController(vc, animated: true)
                }
                return true
            }
        func textFieldDidBeginEditing(_ textField: UITextField) {
            if(textField.text?.count == 0)
            {
                textField.text = " "
            }
        }
    
        @objc func setNextResponder(textfield : UITextField)
        {
            textfield.becomeFirstResponder()
    
        }
        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
            let _char  = string.cString(using: .utf8)
           // const char * _char = [string cStringUsingEncoding:NSUTF8StringEncoding];
           // int isBackSpace = strcmp(_char, "\b");
            let isBackSpace = strcmp(_char, "\\b")
    
            if (isBackSpace == -92) {
                // NSLog(@"Backspace was pressed");
    
    
    
                if (textField == txt4)
                {
                    if(textField.text!.count == 2)
                    {
    
                    }
                    else{
                        self.perform(#selector(setNextResponder), with: txt3, afterDelay: 0.01)
                       txt3.text = " "
                    }
                }
                else if (textField == txt3)
                {
                    if(textField.text!.count == 2)
                    {
    
                    }
                    else{
                        self.perform(#selector(setNextResponder), with: txt2, afterDelay: 0.01)
                        txt2.text = " "
    
                    }
                }
                else if (textField == txt2)
                {
                    if(textField.text!.count == 2)
                    {
    
                    }
                    else{
                        self.perform(#selector(setNextResponder), with: txt1, afterDelay: 0.01)
                        txt1.text = " "
                    }
                }
                else if (textField == txt1)
                {
    
                    if(textField.text!.count == 2)
                    {
    
                    }
                    else{
                        textField.resignFirstResponder()
    
                    }
    
                }
            }
            if (string.count > 1 && !(Scanner.init(string: string).scanInt(nil)))
            {
            return false;
            }
    
            let oldLength = textField.text!.count
            let replacementLength = string.count
            let rangeLength = range.length
           let newLength = oldLength - rangeLength + replacementLength
    
    
            // This 'tabs' to next field when entering digits
            if (newLength == 2) {
                if (textField == txt1)
                {
                    self.perform(#selector(setNextResponder), with: txt2, afterDelay: 0.01)
    
                }
                else if (textField == txt2)
                {
                    self.perform(#selector(setNextResponder), with: txt3, afterDelay: 0.01)
    
                }
                else if (textField == txt3)
                {
                    self.perform(#selector(setNextResponder), with: txt4, afterDelay: 0.01)
    
                }
                else if(textField == txt4)
                {
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    //                let vc = self.storyboard?.instantiateViewController(withIdentifier: "navVC") as! NavigationViewController
    //               vc.modalPresentationStyle = .fullScreen
    //                    self.present(vc, animated: true, completion: nil)
                        var str = self.txt1.text! + self.txt2.text! + self.txt3.text! + self.txt4.text!
                        str = str.replacingOccurrences(of: " ", with: "")
                        self.verify(otp: str)
                    }
                }
    
    
    
            }
    
            return newLength <= 2;
        }
    

    【讨论】:

      【解决方案2】:

      我的做法是这样的:

      import UIKit
      
      class ViewController1: UIViewController, UITextFieldDelegate {
      
          @IBOutlet weak var text1: UITextField!
      
          @IBOutlet weak var text2: UITextField!
          override func viewDidLoad() {
              super.viewDidLoad()
              text1.delegate = self
              text2.delegate = self
          }
      
          func textFieldShouldClear(_ textField: UITextField) -> Bool {
              if textField == text1 {
                  textField.text = ""
                  textField.resignFirstResponder()
                  text2.becomeFirstResponder()
              }
              return false
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        • 2011-08-14
        • 2017-06-25
        • 1970-01-01
        相关资源
        最近更新 更多