在iOS8自定义键盘扩展中获取完整字符串 [英] Get full string in iOS8 Custom Keyboard Extension

查看:236
本文介绍了在iOS8自定义键盘扩展中获取完整字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为iOS 8创建自定义键盘扩展。

I'm creating a Custom Keyboard Extension for iOS 8.

我想获取用户在文本输入字段中写入的整个字符串。

I want to get the whole string that the user wrote in the text input field.

不幸的是我遇到了两个主要问题:

Unfortunately I stumble in to two main problems:

1)我在这个回调中得到null:

1) I get null in this callback:

- (void)textDidChange:(id<UITextInput>)textInput

2)我只获得部分字符串当我调用这些方法时:

2) I only get partial String When I call these methods:

- [self.textDocumentProxy documentContextAfterInput];
- [self.textDocumentProxy documentContextBeforeInput];

我想在用户当前正在编辑的文本输入中获取整个字符串
what你建议我这样做吗?

I want to get the whole string in the text input the user is currently editing what do you suggest i do?

谢谢!

推荐答案

我找到了如何。

- (void)doSomething{
    dispatch_async(inputQueue, ^{
        [self getAllString];
    });
    return;
}

首先使用dispatch_async和您自己的队列包装您的方法。

First Wrap Your Method With dispatch_async and your own queue.

#define DELAY_LENGTH 0.01

-(void)getAllString{
    id<UITextDocumentProxy> proxy = self.textDocumentProxy;
    NSString* before = [proxy documentContextBeforeInput];
    NSString* after = [proxy documentContextAfterInput];

    NSMutableArray* afterArray = [NSMutableArray arrayWithCapacity:10];

    while (after) {
        unsigned long afterLength = [after length];
        if(afterLength <= 0){
            break;
        }
        [afterArray addObject:after];
        [NSThread sleepForTimeInterval:DELAY_LENGTH];
        [proxy adjustTextPositionByCharacterOffset:afterLength];
        [NSThread sleepForTimeInterval:DELAY_LENGTH];
        after = [proxy documentContextAfterInput];
    }

    NSMutableArray* beforeArray = [NSMutableArray arrayWithCapacity:10];

    [NSThread sleepForTimeInterval:DELAY_LENGTH];
    before = [proxy documentContextBeforeInput];

    while (before) {
        unsigned long beforeLength = [before length];
        if (beforeLength <= 0) {
            break;
        }
        [beforeArray addObject:before];
        [NSThread sleepForTimeInterval:DELAY_LENGTH];
        [proxy adjustTextPositionByCharacterOffset:-beforeLength];
        [NSThread sleepForTimeInterval:DELAY_LENGTH];
        before = [proxy documentContextBeforeInput];
    }

    NSLog(@"afterArray: %@",[self getArrayString:afterArray reverse:false]);

    NSString* beforeString = [self getArrayString:beforeArray reverse:true];

    NSLog(@"beforArray: %@",beforeString);

    [NSThread sleepForTimeInterval:DELAY_LENGTH];
    [proxy adjustTextPositionByCharacterOffset:beforeString.length];
}

有两个工具:

@implementation NSArray (Reverse)

- (NSArray *)reversedArray {
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:[self count]];
    NSEnumerator *enumerator = [self reverseObjectEnumerator];
    for (id element in enumerator) {
        [array addObject:element];
    }
    return array;
}

@end

-(NSString*)getArrayString : (NSArray*)array
                   reverse : (BOOL)isReverse{
    NSArray* tar = isReverse ? [array reversedArray] : array;
    NSMutableString* result = [NSMutableString stringWithCapacity:10];
    for (NSString* string in tar) {
        [result appendString:string];
    }
    return result;
}

你必须为每种代理方法小睡一次。

YOU HAVE TO SLEEP LITTLE FOR EACH PROXY METHOD.

结果:

TextBox

012, 345! 6789
0123. 4567! 89012 '34567890.' 123456789

控制台

2015-03-18 21:04:15.034 moveCursor[39413:2692914] afterArray: 
2015-03-18 21:04:15.035 moveCursor[39413:2692914] beforArray: 012, 345! 6789
0123. 4567! 89012 '34567890.' 123456789

这篇关于在iOS8自定义键盘扩展中获取完整字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆