基本上,我有一个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的文本会导致崩溃所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)