これが私が以前にこれを処理した方法です。最初に、テキスト フィールドのファーストレスポンダー ステータスを辞任してキーボードを閉じるメソッドを View Controller に作成します。
- (IBAction)dismissKeyboard:(id)sender
{
[mainTextController resignFirstResponder];
}
次に、ViewController
(またはnib
、ストーリーボードを使用していない場合は) のストーリーボード シーンで、ViewController のview
プロパティのクラスを からUIView
に変更しますUIControl
。プロパティは、view
事実上、他の UI 要素の背後にある背景です。UIView
タッチ イベントには応答できませんが、UIControl
(の直接のサブクラスである) は応答できるため、クラス タイプを変更する必要がありUIView
ます。
最後に、ViewController のメソッドで、ビューがイベントを受け取ったときにメソッドviewDidLoad:
を実行するように View Controller に指示します。dismissKeyboard
UIControlEventTouchDown
- (void)viewDidLoad
{
[super viewDidLoad];
UIControl *viewControl = (UIControl*)self.view;
[viewControl addTarget:self action:@selector(dismissKeyboard:) forControlEvents:UIControlEventTouchDown];
}
編集:
あなたの懸念の一部はtextFieldDidEndEditing:
、キーボードが閉じられたときに呼び出されるようです。これは避けられません。テキスト フィールドがフォーカスを失った場合 (つまり、ファーストレスポンダー ステータス) に常に呼び出されます。ユーザーが の戻るボタンをクリックしたときに実行するコードを配置したことが問題のようですtextFieldDidEndEditing:
。ユーザーがテキスト フィールドの外側に触れたときにそのコードを実行したくない場合は、それを配置する適切な場所ではありません。
代わりに、そのコードを別のメソッドに入れます。
- (IBAction)textFieldReturn:(id)sender
{
if ([mainTextController isFirstResponder]) {
[mainTextController resignFirstResponder];
// put code to run after return key pressed here...
}
}
}
次に、テキスト フィールドがコントロール イベントを送信するときに、Target-Action を介してそのメソッドを呼び出しますUIControlEventEditingDidEndOnExit
。
[mainTextController addTarget:self action:@selector(textFieldReturn:) forControlEvents:UIControlEventEditingDidEndOnExit];
UIControlEventEditingDidEndOnExit
とは異なりますのでご注意くださいUIControlEventEditingDidEnd
。前者は、ユーザーがコントロールの外側をタッチして編集を終了したときに呼び出され、後者は、ユーザーがリターン キーを押して編集を終了したときに呼び出されます。