删除Emoji Bug

问题描述:

我跟着这个链接Find out if Character in String is emoji?尝试限制我的文本字段的字符数量,即使使用表情符号。根据这个链接,我必须根据他们的字形来计算表情符号,除了一个小错误之外,一切正在工作,当我的字形计数达到时,它不会让我再删除字符串。删除Emoji Bug

下面的代码使用的UITextField代表

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

var canEditString : Bool = false 

if textField == self.descTxtField { 

    // Description Text Field 
    if textField.text != nil || textField.text != "" { 

     let currentString = textField.text 
     if (currentString?.containsEmoji)! { 
      print("I have an emoji") 
      let glyphCount = currentString!.glyphCount 
      print(glyphCount) 
      canEditString = glyphCount <= descriptionLimit 
     }else { 
      print("I have no emoji's") 
      let currentCharacterCount = textField.text?.characters.count ?? 0 
      //print(currentCharacterCount) 
      if (range.length + range.location > currentCharacterCount){ 
       return false 
      } 
      let newLength = currentCharacterCount + string.characters.count - range.length 
      canEditString = newLength <= descriptionLimit 
     } 
    } 
    return canEditString 


} else { 

    // Number Text Field 
    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 <= numberLimit 
} 
} 
+0

你应该使用'guard'而不是'let'来减少厄运的金字塔 – Alexander

+0

'range.length'和'string.characters.count'不兼容:*第一个计数UTF-16代码单元而后者计数扩展了Unicode字形集群。看看http://stackoverflow.com/questions/25138339/nsrange-to-rangestring-index的各种答案。 –

+0

你可能感兴趣[如何知道两个表情符号是否会显示为一个表情符号?](http://stackoverflow.com/questions/39104152/how-to-know-if-two-emojis-will-be-显示为一个表情符号) –

String Manifesto

斯威夫特4

表情符号,现在有1字符计数处理字符的限制,使其成为一个容易得多跟踪字符串中的字符数。