文本字段退格动作识别文本字段何时为空?

Posted

技术标签:

【中文标题】文本字段退格动作识别文本字段何时为空?【英文标题】:textfield backspace action identify when textfield is empty? 【发布时间】:2018-12-07 07:32:00 【问题描述】:

我正在尝试使用五个文本字段创建 otp 文本字段。如果添加顶部,所有工作正常,但是当用户尝试将文本字段添加为空并尝试退格并且它没有调用我已经调用的 UItextfiled 的任何委托方法时会出现问题已添加。

我试过这个:-

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

    let  char = string.cStringUsingEncoding(NSUTF8StringEncoding)!
    let isBackSpace = strcmp(char, "\\b")

    if (isBackSpace == -92) 
        println("Backspace was pressed")
    
    return true

但是当文本字段不为空时会调用它。

例如:-

在下面的屏幕截图中添加 1 并在两个不同的文本字段上,第三个是空的,但是当我尝试退格时,它需要进入第二个文本字段(第三个字段为空)这是我面临的问题。

谢谢

【问题讨论】:

【参考方案1】:

@Marmik Shah 和@Prashant Tukadiya 在这里回答我添加了我的答案,为了快速回答我从here 获取了一些代码

第 1 步:

为所有文本字段创建 IBOutletCollection,不要忘记按顺序在所有文本字段中设置标签,例如 [1,2,3,4,5,6]

class ViewController: UIViewController

@IBOutlet var OTPTxtFields: [MyTextField]! // as well as set the tag for textfield in the sequence order

 override func viewDidLoad() 
    super.viewDidLoad()

    //change button color and other options
    OTPTxtFields.forEach  $0.textColor  = .red;  $0.backspaceTextFieldDelegate = self 
    OTPTxtFields.first.becomeFirstResponder()

第 2 步:

在你当前页面的 UITextField 委托方法中

extension ViewController : UITextFieldDelegate, MyTextFieldDelegate 

func textFieldDidEnterBackspace(_ textField: MyTextField) 
    guard let index = OTPTxtFields.index(of: textField) else 
        return
    

    if index > 0 
        OTPTxtFields[index - 1].becomeFirstResponder()
     else 
        view.endEditing(true)
    

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
    let newString = ((textField.text)! as NSString).replacingCharacters(in: range, with: string)


    if newString.count < 2 && !newString.isEmpty 
        textFieldShouldReturnSingle(textField, newString : newString)
      //  return false
    

     return newString.count < 2 || string == ""
    //return true

override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool 
    if action == #selector(copy(_:)) || action == #selector(paste(_:)) 
        return false
    

    return true

func textFieldShouldReturnSingle(_ textField: UITextField, newString : String)

    let nextTag: Int = textField.tag + 1
    textField.text = newString
    let nextResponder: UIResponder? = textField.superview?.viewWithTag(nextTag)
    if let nextR = nextResponder
    
        // Found next responder, so set it.

        nextR.becomeFirstResponder()
    
    else
    
        // Not found, so remove keyboard.
        textField.resignFirstResponder()
        callOTPValidate()
    



第 3 步:

创建用于访问后向功能的文本字段类

class MyTextField: UITextField 
weak var myTextFieldDelegate: MyTextFieldDelegate?

override func deleteBackward() 
    if text?.isEmpty ?? false 
        myTextFieldDelegate?.textFieldDidEnterBackspace(self)
    

    super.deleteBackward()

protocol MyTextFieldDelegate: class 
func textFieldDidEnterBackspace(_ textField: MyTextField)

步骤 - 4

最后按照@Marmik Shah 回答为您的 UITextField 自定义类

第 5 步

使用这个从每个文本字段中获取值

func callOTPValidate()
    var texts:  [String] = []
    OTPTxtFields.forEach   texts.append($0.text!)
    sentOTPOption(currentText: texts.reduce("", +))



  func  sentOTPOption(currentText: String)   
    print("AllTextfieldValue == \(currentText)")
  

【讨论】:

哇,好详细! +1。喜欢 Collection 使用网点的方式:D【参考方案2】:

您可以按 101,102,103,104,105 之类的顺序为您的文本字段添加标签。

当退格被点击时。检查字符串的长度是否等于 0。然后转到 textfield.tag - 1 直到你得到第一个 textfield.like 如果你在 textfield 102 上然后转到 textfield 102-1 = 101。

与输入任何字符时一样,转到下一个文本字段,直到到达最后一个文本字段,例如如果您在文本字段 102 上,然后转到文本字段 102+1 = 103。

您可以使用(self.view.viewWithTag(yourTag) as? UITextField)?.becomeFirstResponder()

我没有系统所以无法发布代码

【讨论】:

更好地使用 IBOUTLETCollection @Anbu.karthik 这里实际上顺序很重要。那么使用 IBOutlet Collection 可以这样做吗?以及如何识别下一个和上一个文本字段【参考方案3】:

您可以覆盖函数deleteBackward() 创建一个继承 UITextField 并触发和 EditingEnd 事件的新 Class。

class MyTextField: UITextField 
    override func deleteBackward() 
        super.deleteBackward()
        print("Backspace");
        self.endEditing(true);
    

然后,在您的 Storyboard 中,为 UITextField 添加一个自定义类

接下来,在您的视图控制器中,在 editingEnd 操作中,您可以切换文本字段。为此,您需要为每个文本字段设置一个标签值。 例如,您有两个文本字段,tfOne 和 tfTwo。 tfOne.tag = 1; tfTwo.tag = 2 现在,如果您当前正在编辑 tfTwo 并且单击了退格键,那么您将当前正在编辑的文本字段设置为 tfOne

class ViewController: UIViewController 
    @IBOutlet weak var tfOne: MyTextField!
    @IBOutlet weak var tfTwo: MyTextField!

    override func viewDidLoad() 
        super.viewDidLoad()
    

    @IBAction func editingEnded(_ sender: UITextField) 
        // UITextField editing ended
        if(sender.tag == 2) 
            self.tfOne.becomeFirstResponder();
        
    

【讨论】:

我的错。更新

以上是关于文本字段退格动作识别文本字段何时为空?的主要内容,如果未能解决你的问题,请参考以下文章

AI终于能生成流畅3D动作片了,不同动作过渡衔接不出bug,准确识别文本指令丨开源...

awk

哪个委托方法将调用单击键盘中的退格按钮

添加到文本字段的 Swift Gesture 识别器在成为第一响应者后无法操作?

as3 文本字段更改字符串值

如何以编程方式添加 touchesBegan 动作?