草庐IT

ios - UITextDocumentProxy adjustTextPositionByCharacterOffset 问题

coder 2023-09-10 原文

我正在使用 Swift 为 iOS 8 开发自定义键盘。我正在尝试编写一个在光标两侧插入文本的函数。

我在继承自 UIInputViewController 的类中定义了这个函数

func nestedTag(tag: NSString) {
    let proxy = self.textDocumentProxy as UITextDocumentProxy
    proxy.insertText(tag)
    proxy.insertText(tag)
    proxy.insertText(" ")
    proxy.adjustTextPositionByCharacterOffset(-1 * (1 + tag.length))

例如,如果我用 !!! 调用 nestedTag 我希望有键盘输入的文本字段:

!!!<CURSOR>!!!<SPACE> 

问题是,如果我在没有输入的情况下专注于一个空文本字段时调用此函数,我会得到这个不正确的结果。

!!!!!!<SPACE><CURSOR>

此外,如果我在关注填充的文本字段时调用此函数,我会得到不同的错误行为。

之前的文本域:

helloworld

之后的文本字段:

hello w!!!!!! orld

在这个例子中,光标确实向左移动了 4 个字符,但是这看起来好像对 adjustTextPositionByCharacterOffset 的调用是在 BEFORE 的三个调用之前调用的insertText 尽管事实并非如此(参见代码)。

documentation对于这两种 UITextDocumentProxy 方法似乎都非常简单且不言自明,而且我似乎没有看到其他人在线遇到此问题。我似乎无法弄清楚我做错了什么以获得这些奇怪的结果。感谢您的宝贵时间。

最佳答案

一直在纠结,但是没找到,所以分享一下

textDocumentProxy 提供了6个方法

(插入, 移动光标, 删除, afterInput, beforeInput, 有文本)

这 6 个方法和异步方法一样需要一些时间。 (每种方法需要不同的时间) ex) 原始序列:move insert move -> 结果:insert move move

因此,我尝试在调用每个方法之前等待一段时间。

semaphoredispatch_asyncdispatch_after 包装每个方法, 我们可以像同步方法一样等待它们。

inputQueue = dispatch_queue_create("happynewyear", 0);
inputQueue2 = dispatch_queue_create("happynewyear2", 0);


-(void)moveCursor:(NSInteger)num{
     dispatch_async(inputQueue2, ^{
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);

        dispatch_after(delay(TIME_INTERVAL), inputQueue, ^{
            [self.textDocumentProxy adjustTextPositionByCharacterOffset:num];
            NSLog(@"moveCursor : %ld",(long)num);
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    });
}

-(void)insertText:(NSString*)string{
    dispatch_async(inputQueue2, ^{
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);

        dispatch_after(delay(TIME_INTERVAL), inputQueue, ^{
            [self.textDocumentProxy insertText:string];
            NSLog(@"insertText : %@",string);
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    });
}

-(void)deleteBackward:(NSInteger)num{
    dispatch_async(inputQueue2, ^{
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);

        dispatch_after(delay(TIME_INTERVAL), inputQueue, ^{

            for (int i = 0; i<num; ++i) {
                [self.textDocumentProxy deleteBackward];
            }
            NSLog(@"deleteBackward : %ld",(long)num);
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    });
}

延迟函数...

inline static dispatch_time_t delay(double delay){
    return dispatch_time(
                         DISPATCH_TIME_NOW,
                         delay * NSEC_PER_SEC
                         );
}

我使用 TIME_INTERVAL 作为 0.01

这个技巧使您的代码保持顺序。

我正在尝试像上面那样的其他方法(afterInput、beforeInput ...),

如果我解决了,我会回来的。

关于ios - UITextDocumentProxy adjustTextPositionByCharacterOffset 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28465153/

有关ios - UITextDocumentProxy adjustTextPositionByCharacterOffset 问题的更多相关文章

随机推荐