gpt4 book ai didi

ios - 设置 UITextView 的文本导致崩溃

转载 作者:可可西里 更新时间:2023-11-01 03:17:36 26 4
gpt4 key购买 nike

我正在尝试设置 UITextView 的文本,其中包含一些非法字符,例如“Unicode Character 'OBJECT REPLACEMENT CHARACTER' (U+FFFC)”。
基本上,我有一个 UITextView。现在用户点击它,键盘出现。现在我使用语音从键盘输入文本(也称为听写)。当听写正在处理时(那时 UITextView 具有对应于默认占位符动画的特殊字符),我尝试使用以下方式设置 TextView 的值:

textView.text = @""

这会造成以下崩溃:

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

我从 crashlytics 获得的堆栈跟踪:

0    CoreFoundation     __exceptionPreprocess + 130
2 CoreFoundation -[NSException initWithCoder:]
3 CoreFoundation mutateError + 222
4 Foundation -[NSString stringByReplacingCharactersInRange:withString:] + 134
5 UIKit __37-[UITextInputController textInRange:]_block_invoke + 310
6 UIFoundation -[NSTextStorage coordinateReading:] + 36
7 UIKit -[UITextInputController textInRange:] + 232
8 UIKit -[TIDocumentState(UITextInputAdditions) _contextAfterPosition:inDocument:] + 190
9 UIKit -[TIDocumentState(UITextInputAdditions) initWithDocument:] + 150
10 UIKit +[TIDocumentState(UITextInputAdditions) documentStateOfDocument:] + 52
11 UIKit -[UIKeyboardImpl updateForChangedSelectionWithExecutionContext:] + 288
12 UIKit -[UIKeyboardTaskQueue continueExecutionOnMainThread] + 352
13 UIKit -[UIKeyboardTaskQueue performTask:] + 248
14 UIKit -[UIKeyboardImpl updateForChangedSelection] + 96
15 UIKit -[UIKeyboardImpl selectionDidChange:] + 102
16 UIFoundation -[NSTextStorage coordinateReading:] + 36
17 UIKit -[UITextInputController _coordinateSelectionChange:] + 100
18 UIKit -[UITextInputController _setSelectedTextRange:] + 604
19 UIKit -[UITextView setAttributedText:] + 392
20 UIKit -[UITextView setText:] + 134

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

可以通过以下步骤重现异常:

  1. 列表项
  2. 在 xcode 中运行项目。
  3. 点击 TextView 。键盘出现。
  4. 按键盘上空格旁边的麦克风按钮。
  5. 一段时间后(4-5 秒),按完成。
  6. 现在您将看到一个微调器在 TextView 中移动。当微调器在 TextView 中移动时按发送。
  7. 你会得到异常。

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

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

但我仍然不明白,如果我们只使用 setText: 设置文本,为什么会发生这种崩溃。

最佳答案

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

解决方法是确保在处理听写时不更改字符串。您可以通过检查当前输入模式的主要语言来执行此操作。当听写正在进行时,它被设置为 dictation:

- (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 的文本导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23680318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com