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,只能添加一个不能删除的主要内容,如果未能解决你的问题,请参考以下文章