187

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

4

22 に答える 22

354

のデリゲートをクラスに設定しましUITextFieldViewController

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

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}
于 2008-11-08T04:16:41.437 に答える
47

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

例えば:

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

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

于 2008-11-08T03:51:31.923 に答える
32

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

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

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

于 2009-05-01T20:20:55.590 に答える
19

くび、ありがとう。あなたのコードはうまくいきました。あなたが言うように(初心者向けに)明示的にするために、 をテキストフィールドが存在するViewControllerと等しくなるように設定する必要がUITextFieldありdelegateます。好きな場所でこれを行うことができます。方法を選びましたviewDidLoad

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}
于 2008-11-13T02:44:36.050 に答える
18

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

于 2010-12-14T22:51:33.537 に答える
11

追加するだけ

[textField endEditing:YES];

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

于 2010-08-19T00:50:21.337 に答える
11

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

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}
于 2016-05-08T23:22:18.307 に答える
2

これが機能するために私がしなければならなかったことです、そして私はキーボード用のテンキーを持っている人(または完了したボタンのない他の人)にとって必要だと思います:

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

    -(IBAction)backgroundIsTapped:(id)sender
    

これは、.hファイルでも定義されています。

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

「背景がタップされた」関数に、私はこれを置きます:

    [answerField resignFirstResponder];

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

    IBOutlet UITextField * <nameoftextfieldhere>;

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

于 2012-06-21T16:52:57.590 に答える
2

メソッド「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]: いいえ
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: キーボードを辞任しました
于 2009-10-01T02:18:30.920 に答える
1

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

[[self view]endEditing:YES];

特定の UITextField キーボードを非表示にしたい場合は、使用してください。

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

<UITextFieldDelegate>
  1. テキストフィールドへの委任を不可能にします。

    self.yourTextField.delegate = self;

  2. このメソッドをビューコントローラーに追加してください。

    -(BOOL)textFieldShouldEndEditing:(UITextField *)textField{ [textField rejectFirstResponder]; はいを返します;}

于 2015-11-03T10:25:29.747 に答える
1

これは、Return キーまたはバックグラウンドでのタッチで編集を終了する非常にクリーンな方法です。

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 でデリゲートが設定されている場合、フォームはそれを変更しません。特定のフィールドに別のデリゲートを設定する理由はあまりないと思いますが、その理由は…</p>

このフォーム ビュー クラスを改善するには、さまざまな方法があります。デリゲートをアタッチする、レイアウトを行う、キーボードがフィールドを覆ったときの処理 ( currentEditingTextField フレームを使用)、次のフィールドの編集を自動的に開始する、などです。

私は個人的にそれを自分のフレームワークに保持しており、機能を追加するために常にサブクラス化しています。「そのまま」で役立つことがよくあります。

役立つことを願っています。乾杯

于 2015-09-08T00:54:30.300 に答える
1

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

ViewController.Swift ファイルに UITextFieldDelegate を実装します (例: class 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
}()

// Mark:- デリゲート 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
}
于 2017-12-28T05:27:08.270 に答える
0

Interface Builder を使用してビューを作成した場合, 次のメソッドを作成するだけです.

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

ビューのテキスト フィールドを右クリックし、イベントを Did End on Exit として設定し、それをメソッド「dismissKeyboard」に接続します。

初心者に最適なガイドは「Head First iPhone and iPad Development, 2nd Edition」です。

于 2013-11-13T09:50:29.283 に答える
0

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

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  
于 2013-09-12T10:12:12.773 に答える