ビューをScrollView(ビューと同じサイズ)で埋めましたが、ユーザーがビュー(またはスクロールビュー)の別の場所をタップしたときに最初のレスポンダーを辞任する方法に固執しています。それを行う方法についてのアイデアはありますか?次の方法を使用していますが、期待どおりに機能しません。
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
支援のためのTHX、
ステファン
私はここで答えを見つけました: link
最終的な目的が最初のレスポンダーの辞任だけである場合、これは機能するはずです:[self.view endEditing:YES]
この方法は、そのために設計されています!参照: endEditing:
ビュー(または埋め込みテキストフィールドの1つ)が最初のレスポンダーステータスを辞職するようにします。
より堅牢でクリーンなソリューションを得るには、タップジェスチャレコグナイザーをプライマリビューに追加します。
これは、ネストされたビューでうまく機能し、コードおよび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];
}
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)
}
最良の選択肢は最短の方法です;)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
UIViewController
はUIResponder
を継承するため、単純な方法(最も賢い方法ではないと確信しています)は、次のメソッド(少なくとも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タップを検出します(タイミング、距離、しきい値カウント!)ただし、それはニーズによって異なります。
ビュー構造が十分に単純な場合、ジェスチャービューをコンテナビューに追加し、ハンドラーが呼び出されるたびに最初のレスポンダーを辞任できます:)
お役に立てれば
誰もまだここでベストアンサーを提示していません:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
この方法に関するドキュメントから:
通常、このメソッドは、ユーザーがタッチしたUIControlオブジェクトによって呼び出されます。 デフォルトの実装では、アクションメソッドを指定されたターゲットオブジェクトにディスパッチします。ターゲットが指定されていない場合は、最初のレスポンダーにディスパッチします。サブクラスはこのメソッドをオーバーライドして、アクションメッセージの特別なディスパッチを実行できます。
その段落の関連部分を太字にしました。 to:
パラメーターにnil
を指定することにより、最初のレスポンダーで指定されたセレクターがどこにいても自動的に呼び出され、ビュー階層のどこにあるかを知る必要はありません。 。これは、ファーストレスポンダーのステータスを辞任させるだけでなく、ファーストレスポンダーで他のメソッドを呼び出すためにも使用できます。
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[self.TextField resignFirstResponder];
return YES;
}
UITextfield(つまり333)に一意のタグを付けてから、最初のレスポンダーを辞任するには次のようにします。
UITextField *textField = (UITextField *)[self.view viewWithTag:333];
[textField resignFirstResponder];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(TapTodissmiss)];
[self.view addGestureRecognizer:tap];
セレクター
-(void)TapTodissmiss{
[self.txtffld resignFirstResponder];
}
IBOutlet
またはテキストフィールドへのポインタを作成し、どこからでも[textField resignFirstResponder];
を呼び出すだけです。
これは、ivが一貫して機能する最も簡単な方法です。ビューにタップジェスチャレコグナイザーを追加するだけで準備完了です。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
私の実装では、[self.view endEditing:YES]は機能しませんでした。
最後にキーボードが非表示になっていることを確認するには、ビューの1つを最初のレスポンダーにし、その後すぐに以下の機能に従って辞任する必要がありました。
-(void) hideKeyboardPlease{
[uiTextTo becomeFirstResponder];
[uiTextTo resignFirstResponder];
}
可能な場合、最良のオプションはIViewをIButtonから継承するようにすることです。
Interface Builderで変更するだけで、すぐに他のボタンと同様に「Touch Up Inside」アクションを作成するオプションが表示されます。
UIButtonはまだビューであるため、ビューは通常どおり機能しますが、誰かがビューをタップすると通知されます。そこで電話できます
[self.view endEditing:YES];
キーボードを辞任する。
ビューがUIScrollViewである場合、このソリューションはあなたのためではないことに注意してください。
更新
別の簡単な方法を見つけました
単にプロパティを宣言します:-
@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];
}
以下のように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
これが私がすることです...
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];
}