ios – 设置UITextView的文本会导致崩溃

ios – 设置UITextView的文本会导致崩溃,第1张

概述我正在尝试设置UITextView的文本,其中包含一些非法字符,如“Unicode Character’OBJECT REPLACEMENT CHARACTER'(U FFFC)”. 基本上,我有一个UITextView.现在用户点击它并且键盘出现.现在我使用语音从键盘发送文本(也称为听写).当听写处理时(当时UITextView具有对应于默认占位符动画的特殊字符),我尝试使用以下方法设置文本视图 我正在尝试设置UITextVIEw的文本,其中包含一些非法字符,如“Unicode Character’OBJECT REPLACEMENT CHaraCTER'(U FFFC)”.
基本上,我有一个UITextVIEw.现在用户点击它并且键盘出现.现在我使用语音从键盘发送文本(也称为听写).当听写处理时(当时UITextVIEw具有对应于默认占位符动画的特殊字符),我尝试使用以下方法设置文本视图的值:
textVIEw.text = @""

这会造成以下崩溃

*** Terminating app due to uncaught exception 'NSRangeException',reason: '-[__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds'

我从崩解剂中获得的堆栈跟踪:

0    CoreFoundation     __exceptionPreprocess + 1302    CoreFoundation     -[NSException initWithCoder:]3    CoreFoundation     mutateError + 2224    Foundation     -[Nsstring stringByReplacingCharactersInRange:withString:] + 1345    UIKit      __37-[UITextinputController textInRange:]_block_invoke + 3106    UIFoundation       -[NSTextStorage coordinateReading:] + 367    UIKit      -[UITextinputController textInRange:] + 2328    UIKit      -[TIdocumentState(UITextinputAdditions) _contextAfterposition:indocument:] + 1909    UIKit      -[TIdocumentState(UITextinputAdditions) initWithdocument:] + 15010    UIKit     +[TIdocumentState(UITextinputAdditions) documentStateOfdocument:] + 5211    UIKit     -[UIKeyboardImpl updateForChangedSelectionWithExecutionContext:] + 28812    UIKit     -[UIKeyboardTaskQueue continueExecutionOnMainThread] + 35213    UIKit     -[UIKeyboardTaskQueue performTask:] + 24814    UIKit     -[UIKeyboardImpl updateForChangedSelection] + 9615    UIKit     -[UIKeyboardImpl selectionDIDChange:] + 10216    UIFoundation      -[NSTextStorage coordinateReading:] + 3617    UIKit     -[UITextinputController _coordinateSelectionChange:] + 10018    UIKit     -[UITextinputController _setSelectedTextRange:] + 60419    UIKit     -[UITextVIEw setAttributedText:] + 39220    UIKit     -[UITextVIEw setText:] + 134

我还创建了一个演示此问题的示例项目.你可以从https://dl.dropboxusercontent.com/u/80141854/TextViewDictationCheck.zip获得这个项目

可通过以下步骤复制例外:

>列表项目
>在xcode中运行项目.
>单击文本视图.键盘出现了.
>按键盘上的空格旁边的麦克风按钮.
>过了一段时间(4-5秒),按完成.
>现在,您将看到一个在textvIEw中移动的微调器.当微调器在textvIEw中移动时按send.
>你会得到例外.

我找到了一种避免崩溃的方法:
在设置UITextVIEw的文本时,我们可以使用以下代码:
我还发现了一个在UITextVIEw上重置文本时可以使用的解决方法:

[self.textVIEw setSelectedRange:NSMakeRange(0,[[self.textVIEw textStorage] length])];[self.textVIEw insertText:@""];[self.textVIEw setText:@""];

但是,如果我们只使用setText:来设置文本,我仍然没有理解这种崩溃的原因.

解决方法 基础代码中发生异常,而不是代码.如果在处理听写时更改了字符串,则存在导致此崩溃的竞争条件.当您触摸麦克风按钮时,它会将占位符放入字符串中,然后在完成处理时将其替换为文本.如果更改字符串并删除占位符,则会导致崩溃.

修复是为了确保在处理听写时不要更改字符串.您可以通过检查当前输入模式主要语言来执行此 *** 作.当听写正在进行时,它将开始听写:

- (IBAction)sendpressed:(ID)sender{    Nsstring *primaryLanguage = [self.textVIEw textinputMode].primaryLanguage;    if(![primaryLanguage isEqualToString:@"dictation"])    {        // Your original method body:        Nsstring *textVIEwText = self.textVIEw.text;        textVIEwText = @"";        self.textVIEw.text = nil;        self.textVIEw.text = @"";    }

}

如果正在进行听写,则会跳过代码以清空textvIEw.

总结

以上是内存溢出为你收集整理的ios – 设置UITextView的文本会导致崩溃全部内容,希望文章能够帮你解决ios – 设置UITextView的文本会导致崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1104671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存