2

テキストビューの入力アクセサリビュー用の「完了」ボタンを備えたカスタムツールバーがあります。この「完了」ボタンがタップされたら、最初のレスポンダーからテキストビューを辞任したいので、次のように呼び出します。

[textView resignFirstResponder];

これはエラーをスローします:

Thread 1: Program received signal: "EXC_BAD_ACCESS".

自動補正が表示されている間に「完了」ボタンがタップされたとき(下の画像を参照)。エラーはまだ私が呼んでも:

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

テキストビューがファーストレスポンダーのようで、辞任できるようですが、辞任できません。このエラーを解決するにはどうすればよいですか? ありがとうございました。

編集 1: 自動修正を有効にしたい。

編集2:下のキャプチャ画像を見てください。

自動補正が表示されます

Zombies編集 3:スキーム設定でオンにした後、ログに記録されるメッセージは次のとおりです。

-[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. の rejectFirstResponder 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 に答える