web-dev-qa-db-ja.com

どこでもタップしてテンキーのキーボードを閉じる方法

テンキー以外の場所をタップしたときにテンキーのキーボードを閉じる最も簡単なコードを知りたい。テキストフィールド内に数字を入力する簡単なアプリケーションです。ユーザーは、テキストフィールドに数字を入力し終わったらキーボードを閉じることができます。ありがとう! :)

51
jsanmtosj

テキスト変数をインスタンス変数またはインスタンスとして宣言していない場合は、次のような簡単なメソッドを実装します:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [textField resignFirstResponder];
}

うまくいくでしょう。

85
Filip Radelic

この方法を試してください、

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

ここで任意の場所をタップすると、キーボードが消えます。 :-)

21

Swift以下のコードを使用

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
 {
       textFiled.resignFirstResponder()
 }

次の最新のアップデートを確認してください リンク

7
abdul sathar

背景をタッチしてキーボードを閉じる

まだそこにいない場合は、Xcodeにアクセスします。コントローラークラスにもう1つのアクションを追加する必要があります。 Control_FunViewController.hファイルに次の行を追加します。

#import <UIKit/UIKit.h>
@interface Control_FunViewController : UIViewController { 
UITextField *nameField;
UITextField *numberField;
}
 @property (nonatomic, retain) IBOutlet UITextField *nameField; ]
@property (nonatomic, retain) IBOutlet UITextField *numberField; 
- (IBAction)textFieldDoneEditing:(id)sender; 
- (IBAction)backgroundTap:(id)sender; 
@end  

ヘッダーファイルを保存します。実装ファイルに切り替えて、このコードを追加します。このコードは、両方のテキストフィールドに、もしあればファーストレスポンダーステータスを生成するよう指示するだけです。ファーストレスポンダーではないコントロールでresignFirstResponderを呼び出すことは完全に安全です。したがって、どちらかがファーストレスポンダーであるかどうかを確認する必要なく、両方のテキストフィールドで安全に呼び出すことができます。

- (IBAction)backgroundTap:(id)sender { 
[nameField resignFirstResponder]; 
[numberField resignFirstResponder];
}

ヒントこのファイルを保存し、Interface Builderに戻ります。次に、ペン先のビューの基になるクラスを変更する必要があります。ペン先のメインウィンドウを見ると、そのビューに3つのアイコンがあることがわかります。 3番目のビューは、ビューと呼ばれ、他のすべてのコントロールとビューをサブビューとして保持するペン先のメインビューです。ペン先のコンテナビューを表す[表示]というアイコンをシングルクリックします。 ␣4を押して、IDインスペクターを表示します。ここで、Interface Builderでオブジェクトインスタンスの基底クラスを変更できます。

コーディング中に、ヘッダーファイルと実装ファイルを頻繁に切り替えます。幸いなことに、Xcodeにはこれらのファイルをすばやく切り替えるためのキーの組み合わせがあります。デフォルトのキーの組み合わせは␣␣␣(option-command-up arrow)ですが、Xcodeの設定を使用して任意のキーに変更できます。76

現在、ClassというラベルのフィールドにはUIViewと表示されています。 UIControlを読み取るように変更します。アクションメソッドをトリガーできるすべてのコントロールはUIControlのサブクラスであるため、基になるクラスを変更することにより、このビューにアクションメソッドをトリガーする機能を与えました。これを確認するには、␣2を押して接続インスペクターを表示します。

Touch Downイベントからファイルの所有者アイコンにドラッグし、backgroundTap:アクションを選択します。現在、アクティブなコントロールなしでビューの任意の場所をタッチすると、新しいアクションメソッドがトリガーされ、キーボードが収縮します。

注ペン先を保存し、戻って試してみましょう。アプリケーションを再度コンパイルして実行します。今回は、[完了]ボタンがタップされたときだけでなく、アクティブなコントロールではない場所をクリックしたときにもキーボードが消えます。これは、ユーザーが期待する動作です。

6
rptwsthi

ここでいくつかのソリューションを実装してみましたが、いくつかの問題があることがわかりました。特に、My UIViewにはUIScrollViewが含まれており、タッチをインターセプトしているように見えます。

それが失敗したとき、「どこでもタップする」ことは少し不特定の動作であり、ユーザーに明確なガイダンスを与える代わりにキーボードを閉じる方法を推測する必要があると考えました。

また、アプリに表示する他のすべてのキーボードに「戻る」または「完了」ボタンがあるので、数字パッドでキーボードを閉じる簡単で直感的な明確に指定された方法をユーザーに提供することにしました使用中の他のキーボード解雇メカニズムに沿って。

これはOPが具体的に要求しているものではないことを理解していますが、「どこでもタップ」要求よりも優れたソリューションであると信じています(そして実装は簡単です!)。

次のコードは、UIViewController-viewDidLoadの一部として呼び出されます。

// My app is restricted to portrait-only, so the following works
UIToolbar *numberPadAccessoryInputView      = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0f)];

// My app-wide tint color is a gold-ish color, so darkGray contrasts nicely
numberPadAccessoryInputView.barTintColor    = [UIColor darkGrayColor];

// A basic "Done" button, that calls [self.textField resignFirstResponder]
UIBarButtonItem *numberPadDoneButton        = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.textField action:@selector(resignFirstResponder)];

// It's the only item in the UIToolbar's items array
numberPadAccessoryInputView.items           = @[numberPadDoneButton];

// In case the background of the view is similar to [UIColor darkGrayColor], this
// is put as a contrasting Edge line at the top of the UIToolbar
UIView *topBorderView                       = [[UIView alloc] initWithFrame:CGRectMake(0, 0, numberPadAccessoryInputView.frame.size.width, 1.0f)];
topBorderView.backgroundColor               = [UIColor whiteColor];
[numberPadAccessoryInputView addSubview:topBorderView];

// Make it so that this UITextField shows the UIToolbar
self.textField.inputAccessoryView           = numberPadAccessoryInputView;

それに伴い、キーボードの上部に、テキスト入力が終了したときにユーザーがどのように進むべきかを明確に示す、ニースできれいな、直感的なコントロールが追加されました。

Appleはこのキーボードに「完了」ボタンを提供する必要がある(Janak Nirmalが投稿したリンクのように)が、これは私にとって最もエレガントなApple以外のソリューションです。

3
mbm29414

アウトレットにdidSetを置き、そこにinputAccessoryViewをアタッチすることで、@ mbmの答えを本当にうまく実装できます。

スウィフトコード:

  @IBOutlet var input: UITextField! { didSet {
    let toolbar = UIToolbar(frame: CGRect(Origin: CGPoint.zero, size: CGSize(width: 0, height: 44)))
    toolbar.items = [
      UIBarButtonItem(barButtonSystemItem: .done, target: self.input,
        action: #selector(resignFirstResponder))
    ]
    input.inputAccessoryView = toolbar
  }}

Xcode 8/iOS 10では、最終的には次のようになります。

enter image description here

2
SimplGy

これを実現するには、UITapGestureRecognizerを使用する必要があります。

UITapGestureRecognizer *tapToDismiss = [[UITapGestureRecognizer alloc]initWithTarget: self action: @selector (dismissNumberKeyBoard:)];

次に、dismissNumberKeyboardメソッドで、

-(Void)dismissNumberKeyboard : (id)sender {

   [yourTextField resignFirstResponder];

}

ハッピーコーディング!

2
Valentina

このような単純な関数を作成してください。

    -(IBAction)hideKeyboard:(id)Sender
{
    [_textValue resignFirstResponder];
}

ここで、ur nibファイルに移動し、この関数をdidEndOnExitを使用してテキストフィールドに接続します。これで、uがテキストフィールドの外側をクリックすると、キーボードが非表示になります。

1
Hadi

カスタムのテンキーまたは他のポップオーバーを作成した場合、別の解決策は、次のようにUIViewの初期化でジェスチャー認識を使用することです。

tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self addGestureRecognizer:tapper];

 _yourViewController = [[CustomViewController alloc] init];
_yourPopoverController = [[UIPopoverController alloc] initWithContentViewController:_yourViewController];
_yourPopoverController.popoverContentSize = CGSizeMake(550, 300);
_yourViewController.delegate = self;

そして、handleSingleTapが表示されている場合はポップオーバーを閉じ、編集を閉じます:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    if ([_yourPopoverController isPopoverVisible]) {
        [_yourPopoverController dismissPopoverAnimated:YES];
    }

    [self endEditing:YES];
}
0
arinmorf

Swift 3/4の場合、このケースが好きです:

  1. View ControllerはUITextFieldDelegateのサブクラスです
  2. ViewDidLoad関数では、yourPhonePadField.delegate = selfを設定する必要があります
  3. そして、この関数をオーバーライドします:

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

通常、ユーザーが[キャンセル]ボタンをタッチすると、これを使用してキーボードが閉じられます-

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
{
    NSLog(@"cancel clicked");
    [searchBar resignFirstResponder]; // dismiss keyboard
    return;
}

ユーザーがキーボード領域外のどこかに触れたときにこれを行いたい場合は、touchesEndedを実装し、そこにこのコードを配置する必要があります-

/* Delegate for when touch ends.  */
-(void)touchesEnded:(NSSet *)touches 
          withEvent:(UIEvent *)event
{
    [searchBar resignFirstResponder];
}

私自身はこれを試したことはありませんが、これでうまくいくはずです...

0

UITableViewに同様のUXを実装する必要がありました(内部にUITextFieldが表示されます)。まず、UITapGestureRecognizerをtableViewに追加します。これは、これから発生するすべてのタップをキャッチし始めます。

UITapGestureRecognizer* tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        [self.tableView addGestureRecognizer:tapGestureRecognizer];
        [tapGestureRecognizer release];

ただし、副作用は、ユーザーがUITextField自体をタップしたときにキーボードを閉じたくないことです。したがって、この場合は区別する必要があります。

HandleTapメソッドの実装は次のようになります。

/*
 In the text editing mode, listens to all taps occurring on the table view to exit the mode. There are two special cases to consider:
 a) Text field's clear button
 b) Text field
 */
-(void)handleTap:(UITapGestureRecognizer*)tapRecognizer 
{
    if(tapRecognizer.state == UIGestureRecognizerStateEnded) 
    {

            //Figure out where the user tapped
            CGPoint p = [tapRecognizer locationInView:textField];
            CGRect textFieldBounds = textField.bounds;
            CGRect clearButtonBounds = CGRectMake(textFieldBounds.Origin.x + textFieldBounds.size.width - 44, textFieldBounds.Origin.y, 44, textFieldBounds.size.height); 

            if(CGRectContainsPoint(clearButtonBounds, p))
                textField.text = @"";

            if(CGRectContainsPoint(textFieldBounds, p))
                return;

        [textField resignFirstResponder];
        //remove the tap gesture recognizer that was added.
        for(id element in self.tableView.gestureRecognizers)
        {
        if([element isKindOfClass:[UITapGestureRecognizer class]])
        {
            [self.tableView removeGestureRecognizer:element];
        }
        }
    }
        [self commitNewText];
    }
}

HTH。気に入ったら答えとしてマークしてください。

-アクシェイ

0
Akshay

Swiftの場合、テキストフィールドの外側の任意の場所をタップして、すべてのテキストフィールドのキーパッドを閉じる最も簡単な方法は次のとおりです。

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
    self.view.endEditing(true)
}
0
XIII

ここにはたくさんの答えがありますが、XCode 5を使用してそれを理解するのに苦労しなければなりませんでした。これを読んでください: /GestureRecognizer_basics/GestureRecognizer_basics.html

TapScroll RecognizerをUIScrollViewに追加します。そのデリゲートをViewControllerに設定します。

このメソッドを追加します。

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

uIScrollView実装コードに追加し、コントロールをクリックして実装コードにドラッグすることにより、Tap Gesture Recognizerに関連付けます。

私のために働いた。

0
Bill Noto

Xcode 5では、タップジェスチャレコグナイザーを使用し、.hでアクションを宣言します。アクションは名前を選択し、.mで

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