これが私が以前にこれを処理した方法です。最初に、テキスト フィールドのファーストレスポンダー ステータスを辞任してキーボードを閉じるメソッドを View Controller に作成します。
- (IBAction)dismissKeyboard:(id)sender
{
[mainTextController resignFirstResponder];
}
次に、ViewController(またはnib、ストーリーボードを使用していない場合は) のストーリーボード シーンで、ViewController のviewプロパティのクラスを からUIViewに変更しますUIControl。プロパティは、view事実上、他の UI 要素の背後にある背景です。UIViewタッチ イベントには応答できませんが、UIControl(の直接のサブクラスである) は応答できるため、クラス タイプを変更する必要がありUIViewます。
最後に、ViewController のメソッドで、ビューがイベントを受け取ったときにメソッドviewDidLoad:を実行するように View Controller に指示します。dismissKeyboardUIControlEventTouchDown
- (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。前者は、ユーザーがコントロールの外側をタッチして編集を終了したときに呼び出され、後者は、ユーザーがリターン キーを押して編集を終了したときに呼び出されます。