Returnキーを押したときにプログラムによってキーボードiOSを閉じる方法


105

UITextFieldプログラムで作成しUITextField、viewControllerのプロパティを作成しました。画面に戻るとタッチでキーボードを閉じる必要があります。画面をタッチして閉じることができましたが、Returnキーを押しても機能しません。

UITextFieldプロパティとして作成せずに、ストーリーボードを使用して、オブジェクトを直接割り当てて初期化する方法を見てきました。可能ですか?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // Do any additional setup after loading the view, typically from a nib.
    
    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 
    
    [self.view addSubview:self.username];
    [_username resignFirstResponder];
    
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"touchesBegan:withEvent:");
    [self.view endEditing:YES];
    [super touchesBegan:touches withEvent:event];
}

@end

回答:


265

簡単な方法は、のデリゲートUITextFieldをself(self.mytestField.delegate = self)に接続し、メソッドtextFieldShouldReturnを使用してキーボードを閉じることです[textField resignFirstResponder];

キーボードを閉じる別の方法は次のとおりです。

[self.view endEditing:YES];

入れて[self.view endEditing:YES];、あなたがキーボード(ボタンのイベント、タッチイベントなど)を解任したいところ。


デリゲートを接続すると、警告やエラーが表示されます。私は以前にあなたの方法を見ましたが、何らかの理由でそれを機能させることができません。これらのメソッドはviewDidLoadに行きますか?
noobsmcgoobs

1
textFieldデリゲートをselfに設定しようとしたときにエラーが発生した場合は、クラス定義にUITextFieldDelegateを追加していない可能性があります。特に...クラスViewController:UIViewController、UITextFieldDelegate {...
TimWhiting

29

次のUITextFieldようなデリゲートメソッドを追加します。

@interface MyController : UIViewController <UITextFieldDelegate>

textField.delegate = self;次に、2つのデリゲートメソッドを追加します。UITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

:私たちは、上記だけがそうのようなあなたのコントローラ実装する場合UITextFieldDelegate、動作することを、追加する必要があります @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK

@iPatelこれら2つのメソッドを追加し、viewDidLoadにself.username.delegate = selfおよび[self.username resignFirstResponder]も追加しました。これは、私が必要とした両方のシナリオで機能します。それは正常ですか、それともコードを使いすぎていますか?
noobsmcgoobs

26

//ビューの背景をタッチしてキーボードを非表示にします

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}

24

これをすばやく使用して、キーボードを閉じます。

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

スウィフト3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)

SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff

17

SWIFT 4:

self.view.endEditing(true)

または

テキストフィールドのデリゲートを現在のビューコントローラーに設定してから、

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

    textField.resignFirstResponder()

    return true

}

Objective-C:

[self.view endEditing:YES];

または

テキストフィールドのデリゲートを現在のビューコントローラーに設定してから、

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];

    return YES;
}

9

アプリデリゲートでは、次のように書くことができます

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:YES];
}

この方法を使用すると、あまり多くのコードを書くことができません。


7

最初のレスポンダーがiOSビュー階層にあるものについてのアイデアを取得してください。テキストフィールドがアクティブ(または最初のレスポンダー)になると、テキストフィールド内をタッチしたとき(またはメッセージをbecomeFirstResponderプログラムで渡したとき)、キーボードが表示されます。したがって、テキストフィールドを最初のレスポンダーから削除するには、resignFirstResponderそこにメッセージを渡す必要があります。

[textField resignFirstResponder];

キーボードのリターンボタンを非表示にするには、デリゲートメソッドtextFieldShouldReturn:を実装してresignFirstResponderメッセージを渡す必要があります。

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}

7

これが私のコードで使用するものです。それは魅力のように機能します!

yourviewcontroller.hに以下を追加します。

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

.mファイルで、これをViewDidLoad関数に追加します。

- (void)viewDidLoad {
    [super viewDidLoad];

    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

また、この関数を.mファイルに追加します。

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

1
action:@selectorはendEditing:YESを実行するのと同じメソッド名を呼び出す必要があることを覚えておいてください。この場合は、「handleSingleTap:」
Marcos Reboucas

4

キーボードがポップアップした後でキーボードを閉じるには、2つのケースがあります。

  1. UITextFieldがUIScrollView内にあるとき

  2. UITextFieldがUIScrollViewの外にあるとき

2.UITextFieldがUIScrollViewの外にある場合、UIViewControllerサブクラスのメソッドをオーバーライドします

すべてのUITextViewのデリゲート追加する必要があります

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. ではスクロールビュー、外側をタップすると、いずれかのイベントが発生しませんので、その場合には、使用をタップジェスチャー認識装置を、ドラッグ&ドロップUITapGestureをスクロールビューのためにと、そのためのIBActionを作成します

IBActionを作成するには、Ctrlキーを押しながらUITapGestureをクリックし、それをビューコントローラーの.hファイルにドラッグします。

ここでは、アクション名としてtappedEventという名前を付けています

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

与えられた情報は次のリンクから導き出されました。詳細については参照するか、情報について理解できない場合は私に連絡してください。

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


ありがとう。あなたの答えが私を助けました。
Archit Kapoor 2016

4

UITextView内ののグループの場合ViewController

Swift 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

Objective-C

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}


3

タグにはiOSとしか書かれていないので、Swift 1.2とiOs 8.4の回答を投稿します。これらをビューコントローラーのswiftクラスに追加します。

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    self.view.endEditing(true)

}

// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()

    return true
}
// MARK: -

また、クラス宣言にUITextFieldDelegateを追加し、テキストフィールドデリゲートをself(ビュー)に設定することを忘れないでください。


3

IN Swift 3

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

または

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }

2

だから、私は背景に触れた後、または戻った後にそれを消すために私がやったことです。delegate = selfをviewDidLoadに追加し、次に.mファイルのdelegateメソッドも追加する必要がありました。

.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@property (strong, atomic) UITextField *username;

@end

.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    return YES;
}



- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

@end

2

Objective-Cでこれを使用して、キーボードを閉じます。

[[UIApplication sharedApplication].keyWindow endEditing:YES];

1

最初に、.hファイルにテキストフィールドdelegeteを追加する必要があります。(BOOL)textFieldShouldReturn:(UITextField *)textFieldこのメソッドが呼び出されていないことを宣言していない場合は、 最初にデリゲートを追加し、そのメソッドにキーボード非表示コードを記述します。

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

これを試して


0

デリゲートを追加:UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

次に、このデリゲートメソッドを追加します

//これは完全に機能するはずです

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

0
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

画面で複数のテキストフィールドを使用する場合この方法では、毎回テキストフィールドに言及する必要はありません

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];

0

スウィフト2:

これがあらゆることをするために行われたことです!

DoneボタンまたはTouch outSideでキーボードを閉じ、Next次の入力に進みます。

StoryBoardでTextFiled Return Keyを最初に変更Nextします。

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2

  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)

}

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}

func onTouchGesture(){
    self.view.endEditing(true)
}

0

現在のビューコントローラーまたはテキストビューがわからない場合は、レスポンダーチェーンを使用できます。

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)

0

迅速な3〜4のために私はのように修正しました

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

クラスのどこかにコピーして貼り付けます。このソリューションは、すべてのUItextfieldを同じように機能させたい場合、または1つしかない場合にのみ機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.