web-dev-qa-db-ja.com

iOSキーボードを閉じるにはどうすればよいですか?

キーボードを消したいUITextfieldがあります。どのコードを使用しても、キーボードを消すことはできないようです。

74
Tyler McMaster
[myTextField resignFirstResponder]

ここ 、「キーボードの表示と非表示」セクションの2番目の段落。

64
Evan Mulawski

複数のテキストフィールドがあり、どれが最初のレスポンダーであるかわからない場合(または、このコードを記述している場所からテキストフィールドにアクセスできない場合)、次を含む親ビューで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を指定するよりもはるかに優れていますが、何らかの理由で最近までそれを見つけられませんでした。

191
benzado

テキストフィールドが最初のレスポンダではないであるが、キーボードが画面上にある場合があります。これらの場合、上記の方法ではキーボードを閉じることができません。

そこに着く方法の一例:

  1. プログラムで画面にABPersonViewControllerをプッシュします。連絡先を開きます。
  2. 「メモ」フィールド(最初の応答者になり、キーボードを起動します)をタッチします。
  3. 他のフィールドを左にスワイプして、「削除」ボタンを表示します。
  4. この時点では、テキストフィールドの中に最初のレスポンダーはいません(プログラムで確認するだけです)が、キーボードはまだあります。 [view endEditing:YES]を呼び出しても何も起こりません。

この場合、View Controllerに編集モードを終了するように依頼する必要もあります。

[viewController setEditing:NO animated:YES];
8
user2216794

endEditingresignFirstResponderが失敗するケースを発見しました。これらのケースではこれがうまくいきました。

ObjC

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];    
[self setEditing:NO];

Swift

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
6
Andres Canella

ビューコントローラー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];
}
6
Thomas.Benz

ヘッダーファイルにアクションを追加することをお勧めします。

-(IBAction)removeKeyboard;

実装では、次のように記述します。

-(IBAction)removeKeyboard
{
[self.textfield resignFirstResponder];
}

NIBファイルで、オプションDidEndOnExitでUITextFiledからファイルの所有者に接続します。こうすることで、リターンを押すと、キーボードが消えます。

それが役に立てば幸い!

6
ibjazz

これにより、特定のテキストフィールドが1つ辞任します。

// Swift
TextField.resignFirstResponder()

// Objective C
[TextField resignFirstResponder];

テキストフィールドを再署名するには、以下のコードを使用します

// Swift
self.view!.endEditing(true)

// Objective C
[self.view endEditing:YES];
2
Milap Kundalia

どの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]);
2
BadPirate

アプリのテキストフィールドを辞退するには

UIApplication.shared.keyWindow?.endEditing(true)

定義により、keyWindowはキーボードを表示するすべての可能なビューのルートビューであるため、このアプローチはクリーンで動作することが保証されています( source ):

キーウィンドウは、キーボードおよびその他の非タッチ関連イベントを受け取ります。一度に1つのウィンドウのみがキーウィンドウになります。

2
Cœur

最後の手段として????

let dummyTextView = UITextView(frame: .zero)
view.addSubView(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
2
ochimasu
-(void)methodName
{
    [textFieldName resignFirstResponder];
}

didEndOnExitでこのメソッド(methodName)を呼び出します

Swiftの場合

このようにキーボードを隠すことができます:

textField.resignFirstResponder()

ユーザーが「イントロ」ボタンを押したときにキーボードを非表示にするには、次のUITextFieldDelegateメソッドを実装する必要があります。

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true
}
1
pableiros

yourTextFieldNameを置き換えるだけです。あなたのテキストフィールド。これにより、キーボードが閉じます。

[yourTextFieldName resignFirstResponder];
1
A.sharif

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 から確認できます。

0
Mert Celik
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    // your code

    [textField reloadInputViews];
}
0
jeet.chanchawat