web-dev-qa-db-ja.com

UITextFieldを編集するときにキーボードをどのように閉じますか

キーボードを非表示にする場合は、UITextFieldにファーストレスポンダーを辞任するように指示する必要があることは知っていますが、ユーザーがキーボードの「完了」キーを押したことを知る方法がわかりません。監視できる通知はありますか?

177
kubi

UITextFieldのデリゲートをViewControllerクラスに設定します。

そのクラスでは、このメソッドを次のように実装しました。

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

テキストフィールドのDidEndOnExitイベントをInterfaceBuilderのアクション(IBAction)に接続すると、ユーザーがキーボードを(リターンキーで)閉じるとメッセージが送信され、送信者はイベントを発生させたUITextFieldへの参照になります。

例えば:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

次に、InterfaceBuilderで、テキストフィールドのDidEndOnExitイベントをコントローラー上のこのアクション(またはUIからイベントをリンクするために使用しているもの)にリンクします。ユーザーがテキストを入力してテキストフィールドを閉じるたびに、コントローラーにこのメッセージが送信されます。

47
Jason Coco

コントローラーでメソッドを作成することもできます

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

次に、IBの接続インスペクターで、イベント「終了時に終了しました」を接続します。

31
Hugo

クビ、ありがとう。コードは機能しました。あなたが言うように(初心者の場合)明示的にするために、UITextFielddelegateをテキストフィールドが存在するViewControllerと等しくなるように設定する必要があります。これはどこでもできます。 viewDidLoadメソッドを選択しました。

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}
19
alexander White

これは、コードをまったく使用せずにキーボードの自動破棄の動作を取得するためのトリックです。ペン先で、IDインスペクターのFirst Responderプロキシオブジェクトを編集し、新しいFirst Responderアクションを追加します。 dummy:と呼びましょう。次に、テキストフィールドの[終了時に終了]イベントをFirst Responderプロキシオブジェクトのdummy:アクションにフックします。それでおしまい!テキストフィールドの「終了時に終了」イベントにはアクションとターゲットのペアがあるため、ユーザーがReturnキーをタップすると、テキストフィールドは自動的にキーボードを閉じます。また、レスポンダーチェーンに送信されたメッセージのハンドラーが見つからない場合でもペナルティはないため、dummy:の実装がどこになくてもアプリはクラッシュしません。

18
matt

追加するだけ

[textField endEditing:YES];

キーボードを無効にし、ピッカービューを表示する場所。

11
user415897

Swiftでは、コントローラーにIBActionを記述し、テキストフィールドの終了時に終了イベントをそのアクションに設定できます。

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}
9
Safin Ahmed

使用することもできます

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

多くのUitextfieldsがある場合に最適:

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

これを機能させるために私がしなければならなかったことは次のとおりです。キーボード用のナンバーパッドを持っている人(または完了ボタンのない他の人)には必要だと思います:

  1. ViewControllerのUIViewをUIControlに変更しました。
  2. という関数を作成しました

    -(IBAction)backgroundIsTapped:(id)sender
    

これも.hファイルで定義されました。

この後、Interface BuilderのViewControllerの「タッチダウン」ビットにリンクしました。

「バックグラウンドがタップされた」機能では、これを置きます:

    [answerField resignFirstResponder];

'answerField'をキーボードを削除したいUITextFieldの名前に変更することを忘れないでください(UITextFieldが以下のように定義されていることを確認してください:)

    IBOutlet UITextField * <nameoftextfieldhere>;

このトピックはおそらくずっと前に死んだことを知っています...しかし、これがどこかで誰かを助けることを願っています!

2
Ryan Bourne

メソッド "textFieldShouldReturn"は、DONEキーを押したテキストフィールドオブジェクトを提供することに気付くでしょう。 TAGを設定すると、そのテキストフィールドをオンにできます。または、オブジェクトのポインターを追跡し、作成者が保存したメンバー値と比較できます。

私のアプローチは、自習のためのこのようなものです:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

一方、私は辞任を拒否する「検証」テストを行いました。説明のためだけなので、ユーザーがNOと入力した場合!フィールドに、それは却下されません。振る舞いは私が望んだとおりでしたが、出力のシーケンスは思ったとおりではありませんでした。

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

以下は、この拒否のNSLog出力とそれに続く受け入れです。私は辞職の結果を返していることに気づくでしょうが、発信者に報告するためにFALSEを返すと思っていましたか?!それ以外には、必要な動作があります。

 13.313 StudyKbd [109:207]-[StudyKbdViewController textFieldShouldReturn:] 
 13.320 StudyKbd [109:207]-[StudyKbdViewController textFieldShouldEndEditing:] 
 13.327 StudyKbd [109:207]いいえ! 
 13.333 StudyKbd [109:207]-[StudyKbdViewController textFieldShouldReturn:]:キーボードを辞退しました
 59.891 StudyKbd [109:207]-[StudyKbdViewController textFieldShouldReturn:] 
 59.897 StudyKbd [109 :207]-[StudyKbdViewController textFieldShouldEndEditing:] 
 59.917 StudyKbd [109:207]-[StudyKbdViewController doneEditText]:NO 
 59.928 StudyKbd [109:207]-[StudyKbdViewController textFieldShouldReturn:]:は辞任しましたキーボード
2
mobibob

Swift 4.2および100%動作します

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        self.textField.delegate = self

    }

    // hide key board when the user touches outside keyboard

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

    // user presses return key

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

}
1

uIViewControllerでのすべての編集が必要な場合は、使用できます。

[[self view]endEditing:YES];

また、特定のUITextFieldキーボードを非表示にする場合は非表示にします。

1. viewcontroller.hにデリゲートを追加します

<UITextFieldDelegate>
  1. あなたのテキストフィールドに委任できないようにします。

    self.yourTextField.delegate = self;

  2. このメソッドをViewControllerに追加します。

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

1

Swift 3のUITextFieldのデリゲートをプログラムで設定します

ViewController.SwiftファイルにUITextFieldDelegateを実装します(例:クラスViewController:UIViewController、UITextFieldDelegate {)

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

//マーク:-デリゲートtextFieldを処理します。

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

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

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}
1
Tanjima

これは、リターンキーまたはバックグラウンドでのタッチでエディションを終了する非常にきれいな方法です

Interface Builderで、UIFormViewクラスのビューにフィールドを埋め込みます

このクラスは何をしますか:

  • 自分自身をフィールドデリゲートとして自動的に添付します(nibから起動するか、手動で追加します)
  • 現在編集されているフィールドの参照を保持する
  • 戻るときにキーボードを閉じるか、バックグラウンドでタッチします

コードは次のとおりです。

インターフェース

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

実装

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

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

@end
  • フォームをサブクラス化し、textFieldValueIsValid:メソッドをオーバーライドすることにより、指定されたフィールドの値が正しくない場合、エディションの終了を回避できます。

  • フィールドにInterface Builderでデリゲートが設定されている場合、フォームはそれを変更しません。特定のフィールドに異なるデリゲートを設定する多くの理由はわかりませんが、なぜ…

このフォームビュークラスを改善するには多くの方法があります-デリゲートをアタッチし、レイアウトを行い、キーボードがフィールドをカバーするときに(currentEditingTextFieldフレームを使用して)処理し、次のフィールドのエディションを自動的に開始します...

私は個人的にそれをフレームワークに保持し、常にサブクラス化して機能を追加します。これは「現状のまま」で非常に有用です。

私はそれが役立つことを願っています。乾杯

1
Moose
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}
0
jake

これを試して

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
0
Vineesh TP

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

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }

Swiftを探している人

1)ITextFieldのデリゲートがストーリーボードのViewControllerに接続されていることを確認してください

2)ViewController.SwiftファイルにITextFieldDelegateを実装します(クラスViewController:UIViewController、UITextFieldDelegate {)

3)以下のデリゲートメソッドを使用する

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }
0
Burf2000

Interface Builderを使用してビューを作成した場合は、次を使用します。メソッドを作成するだけで、

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

ビューのテキストフィールドを右クリックし、イベントを終了時に終了に設定し、メソッド「dismissKeyboard」に配線します。

初心者向けの最良のガイドは、「Head First iPhone and iPad Development、2nd Edition」です

0
chandru

関数hidekeyboardを作成し、それを.xibファイルのテキストフィールドにリンクして、DidEndOnExitを選択します

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  
0
pooja_chaudhary