5

UITableViewCellにUITextFieldがあり、別のセルにボタンがあります。

UITextFieldをクリックします(キーボードが表示されます)。

UITextFieldには、次のメソッドがあります。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
        NSLog(@"yes, it's being called");
 owner.activeTextField = textField;
 return YES;
};

ここで、owner.activeTextFieldは(保持、非アトミック)プロパティです。

問題 キーボードが表示されているときに、セルをスクロールしてビューから外します。次に、別のセルにあるボタンをクリックします。ボタンは次のように呼び出します。

[owner.activeTextField resignFirstResponder]

そしてそれはEXC_BAD_ACCESSを引き起こします。

何か案が?セルは間違いなくメモリ内にあります。私の推測では、それが消えるとビューから削除され、そのプロパティの1つ(親ビュー?)がnilになり、それが上記のエラーの原因になると思います。

私は正しいですか?

TL; DR; UITextFieldがビューから削除されたときに、キーボードを削除(ファーストレスポンダーを辞任)するにはどうすればよいですか?

4

3 に答える 3

2

場合によっては、問題が別のレベルに深くなる可能性があります... レスポンダー チェーンの次のオブジェクト (その後 becomeFirstResponder メッセージを受信するオブジェクト) がゴミでないことを確認してください。ちょっとした考え。

于 2010-08-31T16:06:20.413 に答える
0

owner.activeTextField割り当てが解除されているか、nil に設定されているかどうかを確認しましたか? それが a を呼び出すかどうかはわかりませんEXC_BAD_ACCESSが、試してみる価値があります。

また、 への電話はありますNSNotificationCenterか? 私は今日、間違ったデリゲート を呼び出したため、 EXC_BAD_ACCESSonを引き起こしていた同様のことに苦労していました。becomeFirstResponder[[NSNotificationCenter defaultCenter] removeObserver:keyboardObserver];

于 2012-03-18T05:44:16.177 に答える
0

少し古いですが、従来の手動参照カウント アプリで同じ問題が発生したので、試してみます。注: この問題はARCではもう発生しないはずです (発生する場合、私の解決策は間違いなくそこには当てはまりません...)。

何が起こるかは次のとおりです。

  • テキストフィールドはセルに保存され、(おそらくオーバー)保持されます
  • テキストフィールドでセルをスクロールすると、セルはリサイクルされますが (これは良いことです)、テキストフィールドはそうではありません (これが、バグが発生したときにテキストフィールドがまだメモリ内にある理由です)
  • その時点で、キーボードを閉じると、テキストフィールドのファーストレスポンダーが正しく辞任しますが、呼び出しがビュー階層を下って移動すると、メモリにないセルにヒットします。

問題に対する単純な(そしてエレガントな)解決策は、

  1. uitextfield の過剰保持があれば修正します
  2. UITextField をサブクラス化して、割り当てを解除する前にファーストレスポンダーのステータスを辞任する

次のような単一のメソッド:

- (void) dealloc {
  [self resignFirstResponder];
  [super dealloc];
}

これには、セルが見えなくなるとすぐにキーボードを削除できるという副作用があります。

別の解決策 (さまざまな理由で私が選択したもの) は、テーブルの割り当てが解除されるまで、テキストフィールドを使用してセルを手動で保持およびリサイクルすることです。

あなたはすでにあなたの問題を解決していると確信していますが、これが他の誰かに役立つことを願っています...

于 2014-06-17T14:29:48.030 に答える