2

我有一个带有“完成”按钮的自定义工具栏,用于我的文本视图的输入辅助视图。当点击这个“完成”按钮时,我想从第一响应者那里退出文本视图,所以我打电话:

[textView resignFirstResponder];

这将引发错误:

Thread 1: Program received signal: "EXC_BAD_ACCESS".

当显示自动校正时点击“完成”按钮(见下图)。即使我打电话,错误仍然存​​在:

if ([textView isFirstResponder] && [textView canResignFirstResponder]) [textView resignFirstResponder];

似乎文本视图是第一响应者,可以辞职,但我不能辞职。我该如何解决这个错误?谢谢你。

编辑1:我仍然想启用自动更正。

编辑 2:请看下面的捕获图像。

显示自动校正

编辑 3:在Zombies方案设置中打开后,记录的消息是:

-[TIZephyrCandidate wordOriginFeedbackID]: message sent to deallocated instance 0x52bbc50

但我不知道这条消息的含义是什么以及接下来要做什么。

编辑4:当“完成”按钮在按钮内部被触摸时,将调用辞职第一响应者的方法,通过以下代码行添加目标和动作:

[doneButton addTarget:self action:@selector(resignAllFirstResponders) forControlEvents:UIControlEventTouchUpInside];

resignAllFirstResponders是:

- (void)resignAllFirstResponders
{
    ...

    if ([textView canResignFirstResponder] && [textView isFirstResponder]) 
        [textView resignFirstResponder];

    ...
}
4

2 回答 2

2

如果您使用:

- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString *)aText 

UITextViewDelegate并在方法中直接更改文本,例如:

- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString *)aText
{
 aTextView.text = @"hi";

 return YES;
}

导致崩溃。

  1. 出现拼写检查视图,
  2. 的第一个响应者UITextView
  3. 更改文本直接textView:shouldChangeTextInRange:replacementText委托,

应用程序将崩溃。

于 2012-07-09T08:26:33.587 回答
0

让我回答我自己的问题。无论如何请注意,我不确定这是一个足够好的解决方案,但我只想分享我目前的进展,并仍在等待更好的解决方案。

这个概念是找出文本视图的子视图是否包含UIAutocorrectInlinePrompt导致错误的自动更正弹出窗口的视图。resignFirstResponder然后仅当子视图集不包含时才调用该方法UIAutocorrectInlinePrompt。我的代码是这样的:

NSMutableString *subviewMutableString = [[NSMutableString alloc] init];
[subviewMutableString setString:@""];
for (UIView *subview in textView.subviews)
{
    [subviewMutableString appendFormat:@"%@", subview];
}
if ([subviewMutableString rangeOfString:@"UIAutocorrectInlinePrompt"].location == NSNotFound)
{
    [textView resignFirstResponder];
}

当显示自动更正弹出窗口时,这将不允许从第一响应者退出文本视图。

于 2011-12-19T10:42:38.490 回答