UITextView 委托行为与自定义 iOS 键盘 (SwiftKey) 不同

Posted

技术标签:

【中文标题】UITextView 委托行为与自定义 iOS 键盘 (SwiftKey) 不同【英文标题】:UITextView Delegates Behaving Differently with Custom iOS Keyboards (SwiftKey) 【发布时间】:2014-11-29 08:04:10 【问题描述】:

使用 shouldChangeTextInRange 委托来检测某些短语,在输入 UITextView 时会在普通键盘和自定义键盘(如 SwiftKey)之间切换时提供不同的 rangetext 值(在相同的情况下)。

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text ...

例如:

在我使用普通键盘键入“ABCDEFG HIJ”(不带引号并包括结尾空格)之后的那一刻,我发现range 等于 (11, 0)。但是,使用 SwiftKey,我得到的范围是 (10, 1)。此外,text 将等于使用普通键盘的结束空格,但将等于“J”加上使用 SwiftKey 的空格。如果我想正确检测某些短语,有什么想法为什么会发生这种情况以及如何标准化我的函数的行为? (我的目标是在每次按下空格之前立即检测这两个词)

编辑:这就是我检测空格前两个单词的方式。 我的问题是,当我使用非库存键盘时,range 给了我不同的值

            NSUInteger charsBackUntilSecondSpace = 0;
            NSUInteger numSpacesFound = 0;
            for (int i = (int) range.location - 1; i>= 0; i--) 
                if([textView.text characterAtIndex:i] == ' ') 
                    numSpacesFound++;
                
                if (numSpacesFound == 2) 
                    break;
                
                else 
                    charsBackUntilSecondSpace++;
                
            

            UITextRange *selectedTextRange = textView.selectedTextRange;
            NSUInteger location = [textView offsetFromPosition:textView.beginningOfDocument
                                                    toPosition:selectedTextRange.start];
            NSRange inFrontOfCursorRange = NSMakeRange (location - charsBackUntilSecondSpace, charsBackUntilSecondSpace);

【问题讨论】:

【参考方案1】:

我的目标是检测每个空格之前的两个单词 按

你可以像下面这样实现它:-

NSInteger lenPos=(range.length > 2) ? 2 : range.length;
NSString *txt=[textView.text substringWithRange:NSMakeRange(range.length-lenPos-1, lenPos)] ;

【讨论】:

嗨 Hussain - 在每次按下空格之前立即检测这两个词不是我的问题,事实上我使用自定义键盘时获得的范围值与我使用时不同普通键盘。

以上是关于UITextView 委托行为与自定义 iOS 键盘 (SwiftKey) 不同的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 无法访问 UITableViewCell 类中的 UITextView 委托

如何使 didSelectRowAt IndexPath 与自定义委托一起使用

UITextView 的自定义委托

自 iOS 7 中的删除(退格)操作以来,我如何才能不接收 UITextView 委托消息?

C# 窗体间传值(使用委托与自定义事件)

如何允许 uitextview 只接受退格键和删除键