Siri语音输入绕过了UITextView的shouldChangeTextInRange代理函数

13
我使用(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *) 实现对UITextView中每个字符输入执行实时正则表达式验证。
这个方法很有效,甚至可以处理可能包含无效字符的粘贴文本。
但Siri似乎不关心这些,并将其听写直接转换为 (void)textViewDidChange:(UITextView *)theTextView ,绕过了shouldChangeTextInRange委托并避免了验证检查。
这对我来说似乎是一个安全漏洞,并且打破了其他输入渠道所遵循的API流程。
有何想法可以让Siri听写调用shouldChangeTextInRange ?

4
不知道,但听起来似乎是需要向苹果提交错误报告的好问题。 - rickster
1
жҲ‘жҳҺзҷҪдҪ дёәд»Җд№ҲжңҹжңӣtextView:shouldChangeTextInRange:иў«и§ҰеҸ‘пјҢдҪҶжҳҜеҪ“еүҚзҡ„и§ЈеҶіж–№жЎҲжҳҜпјҢдҪ еҸҜд»ҘжҹҘзңӢUITextInputеҚҸи®®пјҢе®ғжңүеҮ дёӘдёҺеҗ¬еҶҷзӣёе…ізҡ„委жүҳгҖӮ - Sash Zats
很想看到这个问题的更新。比如如何使用UITextInput,以及一个链接到雷达的地址,这样我们就可以追踪进展并投票支持(如果苹果有这个概念的话)。目前,我只是通过捕获textViewDidChange事件来截断文本(如果太长则从字段末尾开始),因为此时我无法知道添加了什么内容和位置。这不是理想的解决方案。 - eselk
@SebastianDwornik,这个有更新了吗? - Iulian Onofrei
来自苹果:工程师已经确定你的错误报告(18866525)是另一个问题(18306033)的重复,因此将被关闭。 - Sebastian Dwornik
显示剩余2条评论
1个回答

0

我认为这就是答案……如果:

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

如果被称为,则它是用户输入。因此,在那里放置一个BOOL来记住是否已经检查了“shouldChange”。

然后,麦克风输入将调用:

-(void)textViewDidChange:(UITextView *)textView

在这里检查您的BOOL,如果它是NO,则是麦克风输入。

(在textViewDidChange:结束时将BOOL设置为NO)

这对我非常有效。


难以理解,措辞不当,最重要的是,没有起作用。被踩了。 - Iulian Onofrei
顺便说一下,如果您不想深入研究UITextInput的口述委托,那么这就是解决方案。 - pronebird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接