【问题标题】:backspace press not calling uitextfield's method退格键不调用 uitextfield 的方法
【发布时间】:2016-11-25 09:10:29
【问题描述】:

我有四个用于 OTP 的 textField,并且还在 ViewDidLoad() 方法中将委托设置为我的视图控制器

我也实现了委托方法:

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
            if string.characters.count > 1 {
                return false
            } else {
                var tag = textField.tag
                if string.characters.count == 0 {
                    tag -= 1
                } else {
                    tag += 1
                }
                textField.text = string
                // Try to find next responder
                let nextResponder = textField.superview?.viewWithTag(tag) as UIResponder!
                nextResponder?.becomeFirstResponder()
            }
            return false
        }



func textFieldShouldReturn(textField: UITextField) -> Bool {
        print("BACKSPACE PRESSED")
        return true
    }

但是当字段为空时,这两个方法都不会调用,实际上我想要明文。当文本字段为空时,如何检测“退格”的任何想法

【问题讨论】:

  • 您是否连接或设置了您的textFielddelegate
  • 如果你发现“BACKSPACE PRESSED”那么你想开发什么功能?
  • Return 并不意味着退格。 Return 表示回车(按下回车键)。
  • @jigneshVadadoriya 我希望以前的文本字段成为第一响应者

标签: ios uitextfield


【解决方案1】:

有检测退格的代码

 const char * _char = [string cStringUsingEncoding:NSUTF8StringEncoding];
    int isBackSpace = strcmp(_char, "\b");

        if (isBackSpace == -8) {
            // Code there
           }

【讨论】:

  • 在“shouldChangeCharactersInRange”委托方法中。
【解决方案2】:

直接识别退格不是正确的逻辑。根据您的要求,您的文本字段变为空白,然后您希望以前的文本字段成为第一响应者,然后您需要像这样编写代码

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

    var txtAfterUpdate:NSString = textField.text! as NSString
    txtAfterUpdate = txtAfterUpdate.replacingCharacters(in: range, with: string) as NSString
    let updatedString = txtAfterUpdate as String

    if updatedString.characters.count == 0 {
        var tag = textField.tag
        tag -= 1
        let nextResponder = textField.superview?.viewWithTag(tag) as UIResponder!
        nextResponder?.becomeFirstResponder()

        return true
    } else{

        // rest of your functionality
    }

    return true
}

希望对你有帮助。

【讨论】:

  • textField 为空时该方法不调用
【解决方案3】:

我通过覆盖 UITextField 的以下方法来获得解决方案。

class MYTextField: UITextField {
    override func deleteBackward() {
        super.deleteBackward()
        delegate?.textFieldShouldReturn!(self)
        print("_____________BACKSPACE_PRESSED_____________")
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多