在UTextView中一次移动光标一个单词(包括像中文这样的语言)

时间:2013-12-10 07:07:19

标签: ios objective-c cursor uitextview

I have read this,但它只能在英语中使用,因为它只使用空格和NewlineCharacterSet之类的东西作为分隔符。 我想在附件输入视图中添加左箭头和右箭头,以便在UITextView中按字词移动光标。 我想知道如何支持某些亚洲语言的功能,如中文

PS:我会添加一个例子,当有英文字符和中文字符时,CFStringTokenizer无法使用

test string: 
Happy Christmas! Text view test 云存储容器测试开心 yeap
the expected boundaries: 
Happy/ Christmas!/ Text/ view/ test/ 云/存储/容器/测试/开心/ yeap/
the boundaries show in reality: 
Happy/ Christmas!/ Text/ view/ test/ 云存储容器测试开心/ yeap/

2 个答案:

答案 0 :(得分:0)

我不会说中文,但根据文档, CFStringTokenizer能够找到多种语言的单词边界, 包括亚洲语言。

以下代码显示了如何从一个单词(第6位的“世界”)前进 到下一个字(位置13的“这个”):

// Test string.
NSString *string = @"Hello world. This is great.";

// Create tokenizer
CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(NULL,
                             (__bridge CFStringRef)(string),
                             CFRangeMake(0, [string length]),
                             kCFStringTokenizerUnitWordBoundary,
                             CFLocaleCopyCurrent());

// Start with a position that is inside the word "world".
CFIndex position = 6;

// Goto current token ("world")
CFStringTokenizerTokenType tokenType;
tokenType = CFStringTokenizerGoToTokenAtIndex(tokenizer, position);
if (tokenType != kCFStringTokenizerTokenNone) {
    // Advance to next "normal" token:
    tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer);
    while (tokenType != kCFStringTokenizerTokenNone && tokenType != kCFStringTokenizerTokenNormal) {
        tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer);
    }

    if (tokenType != kCFStringTokenizerTokenNone) {
        // Get the location of next token in the string:
        CFRange range = CFStringTokenizerGetCurrentTokenRange(tokenizer);
        position = range.location;
        NSLog(@"%ld", position);
        // Output: 13 = position of the word "This"
    }
}

没有CFStringTokenizerAdvanceToPreviousToken()功能,所以要移动到 您必须从字符串的开头开始并前进。

答案 1 :(得分:0)

最后,我使用UITextInputTokenizer来实现功能