web-dev-qa-db-ja.com

ユーザーが他の場所をタップしたときにテキストフィールドからファーストレスポンダーを辞任する方法は?

ビューをScrollView(ビューと同じサイズ)で埋めましたが、ユーザーがビュー(またはスクロールビュー)の別の場所をタップしたときに最初のレスポンダーを辞任する方法に固執しています。それを行う方法についてのアイデアはありますか?次の方法を使用していますが、期待どおりに機能しません。

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

支援のためのTHX、

ステファン

24
Steve

私はここで答えを見つけました: link

最終的な目的が最初のレスポンダーの辞任だけである場合、これは機能するはずです:[self.view endEditing:YES]

この方法は、そのために設計されています!参照: endEditing:

ビュー(または埋め込みテキストフィールドの1つ)が最初のレスポンダーステータスを辞職するようにします。

81
DanSkeel

より堅牢でクリーンなソリューションを得るには、タップジェスチャレコグナイザーをプライマリビューに追加します。

これは、ネストされたビューでうまく機能し、コードおよびUIビルダーの秘密のボタンよりもきれいになります。

あなたのビューではロードしました:

UITapGestureRecognizer* tapBackground = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard:)];
[tapBackground setNumberOfTapsRequired:1];
[self.view addGestureRecognizer:tapBackground];

..タップ時にトリガーされるターゲットアクションを定義します。

-(void) dismissKeyboard:(id)sender
{
    [self.view endEditing:YES];
}
18
Andres Canella

SwiftおよびSwift 4の場合、これを行うことができます。

func viewDidLoad() {
    super.viewDidLoad()

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

    self.view.addGestureRecognizer(tap)
}

@objc func hideKeyboardByTappingOutside() {
    self.view.endEditing(true)
}
10
pableiros

最良の選択肢は最短の方法です;)

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

UIViewControllerUIResponderを継承するため、単純な方法(最も賢い方法ではないと確信しています)は、次のメソッド(少なくとも1つ)を上書きすることです。

– touchesBegan:withEvent:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
- touchesCancelled:withEvent:

次に、あなたがすることによって、感動のビューを得ることができます

UITouch *touch = [touches anyObject];
UIView *touchedView = [touch view];

そのビューがテキストフィールドではない場合、最終的に最初のレスポンダーを辞任します

if(touchedView != textField){
    [textField resignFirstResponder];
}

_

このアプローチのデメリット:

自分で「タップ」を処理する必要があります。 (古いiOS 3.1以前と同じ問題)。シングルタップとドラッグ、スワイプ、ダブルタップ、ロングタップなどを区別するために、独自の実装を考え出す必要があります。うまく動作させることは難しくありませんが、まったく同じ方法で取得することはほとんどありませんAppleタップを検出します(タイミング、距離、しきい値カウント!)ただし、それはニーズによって異なります。

ビュー構造が十分に単純な場合、ジェスチャービューをコンテナビューに追加し、ハンドラーが呼び出されるたびに最初のレスポンダーを辞任できます:)

お役に立てれば

4
nacho4d

誰もまだここでベストアンサーを提示していません:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

この方法に関するドキュメントから:

通常、このメソッドは、ユーザーがタッチしたUIControlオブジェクトによって呼び出されます。 デフォルトの実装では、アクションメソッドを指定されたターゲットオブジェクトにディスパッチします。ターゲットが指定されていない場合は、最初のレスポンダーにディスパッチします。サブクラスはこのメソッドをオーバーライドして、アクションメッセージの特別なディスパッチを実行できます。

その段落の関連部分を太字にしました。 to:パラメーターにnilを指定することにより、最初のレスポンダーで指定されたセレクターがどこにいても自動的に呼び出され、ビュー階層のどこにあるかを知る必要はありません。 。これは、ファーストレスポンダーのステータスを辞任させるだけでなく、ファーストレスポンダーで他のメソッドを呼び出すためにも使用できます。

3
Gavin
    -(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [self.TextField resignFirstResponder];

    return YES;
}
3

UITextfield(つまり333)に一意のタグを付けてから、最初のレスポンダーを辞任するには次のようにします。

UITextField *textField = (UITextField *)[self.view viewWithTag:333];
[textField resignFirstResponder];
2
Lefteris
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(TapTodissmiss)];

[self.view addGestureRecognizer:tap];

セレクター

-(void)TapTodissmiss{

    [self.txtffld resignFirstResponder];

}
1
Ghanshyam Tomar

IBOutletまたはテキストフィールドへのポインタを作成し、どこからでも[textField resignFirstResponder];を呼び出すだけです。

1
Or Ron

これは、ivが一貫して機能する最も簡単な方法です。ビューにタップジェスチャレコグナイザーを追加するだけで準備完了です。

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

[self.view endEditing:YES];

}

0
Andrew Cook

私の実装では、[self.view endEditing:YES]は機能しませんでした。

最後にキーボードが非表示になっていることを確認するには、ビューの1つを最初のレスポンダーにし、その後すぐに以下の機能に従って辞任する必要がありました。

-(void) hideKeyboardPlease{
   [uiTextTo becomeFirstResponder];
   [uiTextTo resignFirstResponder];
}
0
Lenny

可能な場合、最良のオプションはIViewIButtonから継承するようにすることです。

Interface Builderで変更するだけで、すぐに他のボタンと同様に「Touch Up Inside」アクションを作成するオプションが表示されます。

UIButtonはまだビューであるため、ビューは通常どおり機能しますが、誰かがビューをタップすると通知されます。そこで電話できます

[self.view endEditing:YES];

キーボードを辞任する。

ビューがUIScrollViewである場合、このソリューションはあなたのためではないことに注意してください。

0
Julio Bailon

更新

別の簡単な方法を見つけました

単にプロパティを宣言します:-

@property( strong , nonatomic) UITextfield *currentTextfield;

とタップジェスチャジェコナイザー:-

@property (strong , nonatomic) UITapGestureRecognizer *resignTextField;

In ViewDidLoad

_currentTextfield=[[UITextField alloc]init];
_resignTextField=[[UITapGestureRecognizer alloc]initWithTarget:@selector(tapMethod:)];

[self.view addGestureRecognizer:_resignTextField];

テキストフィールドデリゲートメソッドdidBeginEditingを実装する

 -(void)textFieldDidBeginEditing:(UITextField *)textField{


      _currentTextfield=textField;

    }

タップジェスチャメソッドの実装(_resignTextField)

 -(void)tapMethod:(UITapGestureRecognizer *)Gesture{

     [_currentTextfield resignFirstResponder];

 }
0
dreamBegin

以下のようにViewController.hファイルにIBOutletを作成します。

//YOUR ViewController.h FILE

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    //WIRE THIS WITH YOUR UITextField OBJECT AT YOUR .xib FILE
    IBOutlet UITextField *yourIBOutletUITextField;
}

@end

これをViewController.mファイルに追加します。

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

以下のように:

//YOUR ViewController.m FILE

#import "ViewController.h"

@implementation ViewController


//ADD THIS METHOD BELOW
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     [yourIBOutletUITextField resignFirstResponder];
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    }

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end
0
EFE

これが私がすることです...

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideAllKeyboards)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];

-(void) hideAllKeyboards {
    [textField_1 resignFirstResponder];
    [textField_2 resignFirstResponder];
    [textField_3 resignFirstResponder];
    .
    .
    .
    [textField_N resignFirstResponder];
}
0
Fahim Parkar