5

如何遍历 NSString 中的 emojis 有一个 NSString 方法用于遍历 NSString 的子字符串

    NSString *text = @"2012我们 ";
    [text enumerateSubstringsInRange:NSMakeRange(0, [text length]) options:NSStringEnumerationByComposedCharacterSequences  usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    printf("%s- ",[substring UTF8String]);
}];

猜猜输出是什么?

输出是:

    2- 0- 1- 2- - 我- 们-  - - - - - - - - - - - -  - - 

而不是:

   2- 0- 1- 2- - 我- 们-  - - - - - - - - - - 

和美国国旗一样,它是由 和 组成的。国旗的长度似乎是 4,它们由两个长度为 2 的字符组成。虽然枚举了 NSString ,但它给了我而不是

当字符串在 UITextView 中时,键盘中的 BACKSPACE 被点击,它可以处理删除 emoji 而不是 .

在我的应用程序中,我制作了一个自定义表情符号键盘,并且有一个 DELETE 按钮。我想 DELETE 按钮就像键盘上的系统 BACKSPACE 按钮一样工作。

有谁知道如何处理它?

4

4 回答 4

15

要删除 UITextView 中的最后一个字符,只需调用-deleteBackward

- (void)deleteButtonPressed:(id)sender
  {
     [self.textView deleteBackward];
  }
于 2012-08-01T05:59:03.553 回答
2

我不是 unicode 专家,但我相信这里的问题是标志实际上是两个字符。它们是区域指示符号。例如,美国国旗是两个不同的字符:REGIONAL INDICATOR SYMBOL LETTER UREGIONAL INDICATOR SYMBOL LETTER S

http://en.wikipedia.org/wiki/Regional_Indicator_Symbol

您可能很幸运地要求文本输入系统为您进行标记化,因为它似乎理解(例如在删除时)它们应该被视为一个单元。尝试使用该UITextInputTokenizer方法positionFromPosition:toBoundary:inDirection:从字符串的末尾移动到前一个字符(即 pass UITextGranularityCharacter)。您可以从 UITextView 或 UITextArea 的tokenizer方法中获取标记器。

希望有帮助!

于 2012-07-31T23:54:16.447 回答
1

下面是一个基于 Jesse Rusak 建议的解决方案,但是即使 UITextInputTokenizer 似乎也无法正确解析文本,除非当然是我的错误:)

+(void)parse:(UITextField *)textfield {
    id<UITextInputTokenizer> tokenizer = [textfield tokenizer];
    UITextPosition *pos = textfield.beginningOfDocument;

    while (true) {
        UITextRange *range = [tokenizer rangeEnclosingPosition:pos withGranularity:UITextGranularityCharacter inDirection:UITextStorageDirectionForward];
        NSString *oneCharacter = [textfield textInRange:range];

        NSLog( @"%@", oneCharacter );

        pos = [textfield positionFromPosition:pos offset:-1];

        if (pos == nil) break;
    }
}
于 2014-07-30T18:15:35.073 回答
0

如果有人在现代遇到此问题,请知道该问题已在 iOS 10 或更早版本中修复。以下 Swift Playground 代码现在可以正确打印标志(区域指示符符号对):

import Foundation

var str = "2017我们"

str.enumerateSubstrings(in: str.startIndex..<str.endIndex, options: .byComposedCharacterSequences) { (substr, range, enclRange, stop) in
    print(substr!)
}
于 2017-06-23T13:59:04.040 回答