UITextField上的限制字符会破坏Emojis,只能添加一个不能删除

Posted

技术标签:

【中文标题】UITextField上的限制字符会破坏Emojis,只能添加一个不能删除【英文标题】:Limiting characters on UITextField breaks Emojis, can only add one and not delete 【发布时间】:2016-02-22 05:57:33 【问题描述】:

我正在使用以下代码来限制 UITextField 中的字符数量

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

        let currentCharacterCount = textField.text?.characters.count ?? 0
        if (range.length + range.location > currentCharacterCount)
            return false
        
        let newLength = currentCharacterCount + string.characters.count - range.length
        return newLength <= 44
    

这是通过将 UITextField 的委托设置为 self 来完成的。

--

这里的问题是,如果您将表情符号添加到文本字段,则无法将其删除。即使您突出显示 - 全选,或使用“剪切”,文本也不会改变。表情符号可以在文本之前或之后,甚至可以单独在文本字段中。您也不能在该字段中添加两个表情符号。

我不明白这是什么问题,谁能帮帮我?

【问题讨论】:

需要澄清- 1.首先你想在 UItextfeild 中限制一个表情符号吗? 2. 您试图删除 textfeild 中的文本,但表情符号仍然存在,但文本被删除。对吗? 【参考方案1】:

最好不要在 shouldChange.. 函数内进行任何检查,而是使用 UITextFieldTextDidChangeNotification 通知单独跟踪长度。示例代码附在下面。在 shouldChange..just 返回一个在 textDidChange 中设置的布尔值。在这里你会得到正确的长度。我注意到,在您的方法中,一旦您添加了表情符号,它甚至不允许您再输入。输入 emoji 字符后,甚至不会调用 shouldChangeCharactersInRange。

class ViewController: UIViewController, UITextFieldDelegate

    @IBOutlet weak var textField:UITextField!
    var allow = true

    override func viewDidLoad() 
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "textFieldDidChange:", name: UITextFieldTextDidChangeNotification, object: textField)
        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

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

    func textFieldDidChange(notification:NSNotification)
    
        let length = textField.text?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
        if length > 44 
            allow = false
         else 
            allow = true
        
    


【讨论】:

谢谢你,虽然它确实有帮助,但它仍然设法随机挂起。有时可能是 2 或 3 个表情符号,有时可能是 4-5 个。我知道表情符号最多占用 6 个字符,所以这不是问题所在。同样的问题仍然存在,而您无法添加文本或删除任何内容,整个文本字段就会变得无效。【参考方案2】:

在 Swift 3.1 中

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
    let currentCharacterCount = textField.text?.characters.count ?? 0
    let limit = 10
    return currentCharacterCount < limit || string.characters.count < range.length

这不会阻止复制和粘贴长文本字符串,我禁用了 UITextField 的粘贴功能,代码来自

https://***.com/a/39015132/6311644

【讨论】:

以上是关于UITextField上的限制字符会破坏Emojis,只能添加一个不能删除的主要内容,如果未能解决你的问题,请参考以下文章

iOS 输入框如何限制字符长度和emoji

将 UITextField 限制在某个字符范围内

无法将字符限制为 iOS 中 UITextField 内的字母数字 [重复]

限制输入到 UITextField 的字符数

没有特殊字符的UITextfield限制ios目标c

BearSkill实用方法之UITextField限制输入的字符数量