この質問と同様に、UITextField を持つ UITableViewCell のカスタム サブクラスがあります。ユーザーが別のテーブルビューセルまたはテーブルの外にあるものに触れたときに、キーボードが消えないことを除いて、正常に動作します。セルの外側の何かが触れられたときに見つけるのに最適な場所を見つけようとしています。それから、テキスト フィールドで rejectFirstResponder を呼び出すことができます。
UITableViewCell がビュー外のタッチのタッチ イベントを受信できる場合は、ResignFirstResponder 自体を再起動できますが、セルでこれらのイベントを取得する方法がわかりません。
編集: UITableViewCell サブクラスでこれ(以下)を試しましたが、動作しません。イベントがコントロールによって処理された場合、 touchesBegan:withEvent: が呼び出されないためだと思います。イベントがレスポンダーチェーンに送信される前に、イベントをキャッチする必要があると思います。
私が検討している解決策は、ビュー コントローラーに touchesBegan:withEvent: メソッドを追加することです。そこで、タッチがあったものを除いて表示されているすべてのテーブルビュー セルに、resignFirstResponder を送信できます (タッチ イベントを取得して、それ自体を処理させます)。
たぶん、この擬似コードのようなもの:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint touchPoint = // TBD - may need translate to cell's coordinates
for (UITableViewCell* aCell in [theTableView visibleCells]) {
if (![aCell pointInside:touchPoint withEvent:event]) {
[aCell resignFirstResponder];
}
}
}
これが最善の方法であるかどうかはわかりません。tableviewcell 自体がビュー外のイベントのイベント通知を受け取る方法はないようです。
EDIT2: hitTest: withEvent : を使用して回答があると思いました (回答として投稿したこともありました) が、うまくいきませんでした。いつも呼ばれるとは限りません。:-(