退格键不调用 uitextfield 的方法

Posted

技术标签:

【中文标题】退格键不调用 uitextfield 的方法【英文标题】:backspace press not calling uitextfield's method 【发布时间】: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 请参考***.com/q/1977934/5215474 如果你发现“BACKSPACE PRESSED”那么你想开发什么功能? Return 并不意味着退格。 Return 表示回车(按下回车键)。 @jigneshVadadoriya 我希望以前的文本字段成为第一响应者 【参考方案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_____________")
    
 

【讨论】:

以上是关于退格键不调用 uitextfield 的方法的主要内容,如果未能解决你的问题,请参考以下文章

如果我长时间按退格键,UITextField shouldChangeCharactersInRange 将停止调用

关于xshell连接limux界面按退格键不正常的问题

远程登录退格键错误[关闭]

使用 shouldChangeCharactersInRange 在 UITextField 验证中考虑退格

从 UITextField 退格加号 (+) - 奇怪的错误

iOS 6 UITextField Secure - 如何检测退格清除所有字符?