web-dev-qa-db-ja.com

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

プログラムでUITextFieldをviewControllerのプロパティにするUITextFieldを作成しました。戻ると画面をタッチしてキーボードを閉じる必要があります。画面をタッチして閉じることができましたが、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
98
noobsmcgoobs

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

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

[self.view endEditing:YES];

キーボードを閉じる場所(ボタンイベント、タッチイベントなど)に[self.view endEditing:YES];を配置します。

250
Nitin Gohel

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

@interface MyController : UIViewController <UITextFieldDelegate>

textField.delegate = self;を設定してから、UITextFieldの2つのデリゲートメソッドも追加します。

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

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

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

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

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

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

Swift

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

Swift 4:

self.view.endEditing(true)

または

テキストフィールドのデリゲートを現在のViewControllerに設定してから:

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

    textField.resignFirstResponder()

    return true

}

目的C:

[self.view endEditing:YES];

または

テキストフィールドのデリゲートを現在のViewControllerに設定してから:

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

    return YES;
}
11
Sam

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

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

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

8
DKong

コードで使用するものは次のとおりです。それは魅力のように機能します!

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];
}
6
Takide

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

[textField resignFirstResponder];

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

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

UITextView内のViewControllersのグループの場合:

Swift 3.

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

キーボードがポップアップした後にキーボードを閉じるには、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を作成しますit

iBActionを作成するには、Ctrlキーを押しながらUITapGestureをクリックし、それをviewcontrollerの.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/

3
user4993619

IN Swift

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
Amul4608

私はこれが他の人によって回答されていることを知っていますが、バックグラウンドイベントもカバーしていない別の記事、tableviewまたはscrollviewを見つけました。

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

2
zainoz.zaini

タグにはiOS iがSwift 1.2およびiOs 8.4の回答を投稿するだけであるため、View Controllerの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(ビュー)に設定することを忘れないでください。

2
Juan Boero

だから、背景に触れたり戻ったりした後にそれを却下するために私がしたことはここにあります。 viewDidLoadにdelegate = selfを追加し、その後.mファイルにデリゲートメソッドを追加する必要がありました。

.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
1
noobsmcgoobs

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

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

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

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

これを試してください。

1
Jitendra
- (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
Harshad

デリゲートの追加:UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

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

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

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

Swift 2:

これは、あらゆることを行うために行われたものです!

Doneボタンでキーボードを閉じるか、次の入力に進むにはTouch outSideNextを押します。

まず、StoryBoardでTextFiled Return KeyNextに変更します。

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
Mojtabye

現在のView ControllerまたはTextViewがわからない場合は、Responder Chainを使用できます。

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

for Swift 3-4 iのように修正

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

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

0
hall.keskin