キーボードを消したいUITextfieldがあります。どのコードを使用しても、キーボードを消すことはできないようです。
[myTextField resignFirstResponder]
ここ 、「キーボードの表示と非表示」セクションの2番目の段落。
複数のテキストフィールドがあり、どれが最初のレスポンダーであるかわからない場合(または、このコードを記述している場所からテキストフィールドにアクセスできない場合)、次を含む親ビューでendEditing:
を呼び出すことができます。テキストフィールド。
View Controllerのメソッドでは、次のようになります。
[self.view endEditing:YES];
このパラメーターは、テキストフィールドにファーストレスポンダーステータスを強制的に辞任させます。デリゲートを使用して検証を実行しており、テキストフィールドのコンテンツが有効になるまですべてを停止する場合は、次のようにコーディングすることもできます。
BOOL didEndEditing = [self.view endEditing:NO];
if (didEndEditing) {
// on to the next thing...
} else {
// text field must have said to first responder status: "never wanna give you up, never wanna let you down"
}
endEditing:
メソッドは、個々のテキストフィールドにresignFirstResponder
を指定するよりもはるかに優れていますが、何らかの理由で最近までそれを見つけられませんでした。
テキストフィールドが最初のレスポンダではないであるが、キーボードが画面上にある場合があります。これらの場合、上記の方法ではキーボードを閉じることができません。
そこに着く方法の一例:
この場合、View Controllerに編集モードを終了するように依頼する必要もあります。
[viewController setEditing:NO animated:YES];
endEditing
とresignFirstResponder
が失敗するケースを発見しました。これらのケースではこれがうまくいきました。
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
[self setEditing:NO];
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
ビューコントローラーYourViewController.hファイルで、UITextFieldDelegateプロトコルを必ず実装してください。
@interface YourViewController : <UITextFieldDelegate>
@end
次に、YourViewController.mファイルで、次のインスタンスメソッドを実装します。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.yourTextField1 resignFirstResponder];
[self.yourTextField2 resignFirstResponder];
...
[self.yourTextFieldn resignFirstResponder];
}
ヘッダーファイルにアクションを追加することをお勧めします。
-(IBAction)removeKeyboard;
実装では、次のように記述します。
-(IBAction)removeKeyboard
{
[self.textfield resignFirstResponder];
}
NIBファイルで、オプションDidEndOnExitでUITextFiledからファイルの所有者に接続します。こうすることで、リターンを押すと、キーボードが消えます。
それが役に立てば幸い!
これにより、特定のテキストフィールドが1つ辞任します。
// Swift
TextField.resignFirstResponder()
// Objective C
[TextField resignFirstResponder];
テキストフィールドを再署名するには、以下のコードを使用します
// Swift
self.view!.endEditing(true)
// Objective C
[self.view endEditing:YES];
どのtextFieldが最初のレスポンダーであるかわからない場合は、見つけることができます。私はこの機能を使用します:
UIView *resignFirstResponder(UIView *theView)
{
if([theView isFirstResponder])
{
[theView resignFirstResponder];
return theView;
}
for(UIView *subview in theView.subviews)
{
UIView *result = resignFirstResponder(subview);
if(result) return result;
}
return nil;
}
次に、コード呼び出しで:
UIView *resigned = resignFirstResponder([UIScreen mainScreen]);
アプリのテキストフィールドを辞退するには
UIApplication.shared.keyWindow?.endEditing(true)
定義により、keyWindowはキーボードを表示するすべての可能なビューのルートビューであるため、このアプローチはクリーンで動作することが保証されています( source ):
キーウィンドウは、キーボードおよびその他の非タッチ関連イベントを受け取ります。一度に1つのウィンドウのみがキーウィンドウになります。
最後の手段として????
let dummyTextView = UITextView(frame: .zero)
view.addSubView(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
-(void)methodName
{
[textFieldName resignFirstResponder];
}
didEndOnExitでこのメソッド(methodName)を呼び出します
Swiftの場合
このようにキーボードを隠すことができます:
textField.resignFirstResponder()
ユーザーが「イントロ」ボタンを押したときにキーボードを非表示にするには、次のUITextFieldDelegate
メソッドを実装する必要があります。
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
yourTextFieldName
を置き換えるだけです。あなたのテキストフィールド。これにより、キーボードが閉じます。
[yourTextFieldName resignFirstResponder];
3 Simple&Swift steps
以下のようにUITextFieldDelegate
をクラスに追加します。
class RegisterVC: UIViewController, UITextFieldDelegate {
//class implementation
}
クラスの実装で、デリゲート関数textFieldShouldEndEditing:
を追加します。
internal func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.view.endEditing(true)
return true
}
最後のステップとして、適切な場所で、UITextField
(s)デリゲートをselfに設定します。たとえば、viewDidLoad
関数の内部:
override func viewDidLoad(){
super.viewDidLoad()
myTextField1.delegate = self
myTextField2.delegate = self
..
..
}
これで、ユーザーがリターンキーを押すたびに、キーボードが消えます。
サンプルスニペットも用意しました。 here から確認できます。
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
// your code
[textField reloadInputViews];
}