Swift:无法在基于条件的字符限制的文本字段中删除字符

Posted

技术标签:

【中文标题】Swift:无法在基于条件的字符限制的文本字段中删除字符【英文标题】:Swift: Can not delete characters in textField with condition based character restriction 【发布时间】:2017-01-20 11:13:56 【问题描述】:

我对一个文本字段有这个条件,其中 -

    如果在国家/地区的下拉列表中选择 BE,则相同形式的文本字段应仅允许 4 个字符 如果不是 BE,则文本字段仅允许 12 个字符。

我使用 -

实现了这个
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool

问题:

上述实现运行良好,但是 -

    我选择 BE 以外的国家(即文本字段中允许 12 个字符)并保存数据。 重新打开表单并选择“BE”。现在我根本无法编辑文本字段。

我该如何解决这个问题?

这是我的完整代码 -

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

        var maxLength: Int?
        let newText = NSString(string: textField.text!).stringByReplacingCharactersInRange(range, withString: string)

        if ((textField.textInputMode?.primaryLanguage == "emoji") || (textField.textInputMode?.primaryLanguage == nil))
            return false
        

        switch textField 

        case postCodeText:

            if (self.selectedCountryCode == "BE") 
                maxLength = 4
            

            else 
                maxLength = 12
            

            return newText.characters.count <= maxLength


        case streetText:
            maxLength = 40
            return newText.characters.count <= maxLength
        
    

编辑 1:添加了屏幕录像 recordit link demonstrating the problem

【问题讨论】:

退格在文本字段编辑上是否有效 一般来说,是的,它工作正常......但是当我尝试“问题”部分中解释的场景时,退格不起作用 【参考方案1】:

简单的解决方案是,每当您选择一个国家/地区时,只需将先前的文本保存到另一个字符串中,如果需要存储先前的记录,否则只需在每次从下拉选择方法中选择一个国家/地区时清除 textField。 因为您选择的不是 BE,所以它会将范围扩展到 12,并且您在 textField 中输入了超过 4 个字符,并且当您将国家/地区更改回 BE 时,textField 的数据已经超过了 BE 的范围,所以它不会'不允许你更改文本。

以下仅为演示示例

func didSelectCountryFromDropDown() 
    self.textField.text = ""


【讨论】:

以上是关于Swift:无法在基于条件的字符限制的文本字段中删除字符的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中创建 UITextFieldDelegate 以限制字符数

在 Swift 中将文本限制为一定数量的单词

Swift 多文本字段参数

用户在 Swift 中提交所有文本字段后如何启用按钮

Swift:数组、文本字段和 UITableView

如何在 iOS swift 中使用文本字段过滤日期数组?