テーブルの多くのセルにかなりの数のコントロールが散在しています。すべてのコントロールをループして最初のレスポンダーとしてすべてを辞任せずにキーボードを非表示にする簡単な方法があるかどうか疑問に思いました。私は質問だと思います。現在のファーストレスポンダをキーボードに取得するにはどうすればよいですか?
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
テーブルの多くのセルにかなりの数のコントロールが散在しています。すべてのコントロールをループして最初のレスポンダーとしてすべてを辞任せずにキーボードを非表示にする簡単な方法があるかどうか疑問に思いました。私は質問だと思います。現在のファーストレスポンダをキーボードに取得するにはどうすればよいですか?
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
回答:
試してください:
[self.view endEditing:YES];
[self.view endEditing:YES];
。Objective-CではBOOL値がYES / NOであるためです。
現在編集中のビューに、最初のレスポンダのステータスを強制的に辞任させることができます[view endEditing:YES]
。これによりキーボードが非表示になります。
とは異なり-[UIResponder resignFirstResponder]
、-[UIView endEditing:]
はサブビューを検索して、現在の最初のレスポンダを見つけます。したがって、それをトップレベルのビュー(例:self.view
内UIViewController
)に送信すると、正しい動作をします。
(この回答には以前、他のいくつかのソリューションが含まれていましたが、これらも機能しましたが、必要以上に複雑でした。混乱を避けるために、それらを削除しました。)
[self.view endEditing:YES];
答えは優れています。
[UIView endediting:]
機能するかを正確に説明しています。私が開発したアプリの1つで、UINavigationViewControllerに検索ボックスが追加されました。ビューコントローラー[self.view endEditing:YES]
としてを呼び出すだけでself
は機能しません。代わりに、検索ボックスが追加されたビュースコープでこのメソッドを直接呼び出しました。例:[self.mySearchBoxView endEditing:YES]
。
nilターゲットアクションをアプリケーションに送信できます。これは、どのビューが現在ファーストレスポンダステータスであるかを気にする必要なく、いつでもファーストレスポンダを辞任します。
Objective-C:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
Swift 3.0:
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
Nilを対象とするアクションは、Mac OS Xではメニューコマンドに共通ですが、iOSではこれらを使用します。
正直なところ、私はここで提案されているソリューションのどれにも夢中ではありません。TapGestureRecognizerを使用する良い方法を見つけました。問題の核心に到達すると思います。キーボード以外の何かをクリックすると、キーボードを閉じます。
viewDidLoadで、キーボード通知を受信してUITapGestureRecognizerを作成するように登録します。
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name:
UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name:
UIKeyboardWillHideNotification object:nil];
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(didTapAnywhere:)];
キーボードの表示/非表示レスポンダを追加します。そこで、タップするとキーボードを閉じるはずのTapGestureRecognizerをUIViewに追加して削除します。注:すべてのサブビューまたはコントロールに追加する必要はありません。
-(void) keyboardWillShow:(NSNotification *) note {
[self.view addGestureRecognizer:tapRecognizer];
}
-(void) keyboardWillHide:(NSNotification *) note
{
[self.view removeGestureRecognizer:tapRecognizer];
}
TapGestureRecognizerは、タップを受け取ると関数を呼び出し、次のようにキーボードを閉じることができます。
-(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {
[textField resignFirstResponder];
}
このソリューションの優れた点は、スワイプではなくタップのみをフィルタリングすることです。したがって、キーボードの上にコンテンツをスクロールしている場合でも、スワイプはスクロールし、キーボードは表示されたままになります。キーボードがなくなった後にジェスチャーレコグナイザーを削除することで、ビューの今後のタップは通常どおり処理されます。
これは、1つの場所にコードを追加することによりreturn
、任意のテキストフィールドでヒットしたときにキーボードが表示されないようにするためのソリューションです(各テキストフィールドにハンドラーを追加する必要はありません)。
このシナリオを検討してください:
私はviewcontroller
2つのテキストフィールド(ユーザー名とパスワード)を持っています。およびviewcontroller
実装UITextFieldDelegate
プロトコル
私はviewDidLoadでこれを行います
- (void)viewDidLoad
{
[super viewDidLoad];
username.delegate = self;
password.delegate = self;
}
そしてviewcontrollerはオプションのメソッドを次のように実装します
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
そして、あなたがいるテキストフィールドに関係なく、私がreturn
キーボードを押すとすぐに、それは却下されます!
あなたの場合、テキストフィールドのすべてのデリゲートをselfに設定して実装する限り、同じことが機能します textFieldShouldReturn
より良いアプローチは、何かを「盗む」ファーストレスポンダステータスを持つことです。
UIApplicationはUIResponderのサブクラスなので、次のことを試すことができます。
[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]
それが失敗した場合は、サイズがゼロのフレームで新しいUITextFieldを作成し、それをビューのどこかに追加して、同様のことを行います(その後、辞任します)。
これをいくつかのユーティリティクラスに入れます。
+ (void)dismissKeyboard {
[self globalResignFirstResponder];
}
+ (void) globalResignFirstResponder {
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
for (UIView * view in [window subviews]){
[self globalResignFirstResponderRec:view];
}
}
+ (void) globalResignFirstResponderRec:(UIView*) view {
if ([view respondsToSelector:@selector(resignFirstResponder)]){
[view resignFirstResponder];
}
for (UIView * subview in [view subviews]){
[self globalResignFirstResponderRec:subview];
}
}
@Nicholas Riley&@Kendall Helmstetter Geln&@cannyboy:
絶対に素晴らしい!
ありがとうございました。
あなたのアドバイスとこのスレッドの他の人のアドバイスを考慮して、これは私がやったことです:
使用時の外観:
[[self appDelegate] dismissKeyboard];
(注:NSObjectへの追加としてappDelegateを追加したので、どこでもどこでも使用できます)
ボンネットの下の様子:
- (void)dismissKeyboard
{
UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
tempTextField.enabled = NO;
[myRootViewController.view addSubview:tempTextField];
[tempTextField becomeFirstResponder];
[tempTextField resignFirstResponder];
[tempTextField removeFromSuperview];
}
編集
含まれた私の答えへの修正tempTextField.enabled = NO;
。テキストフィールドを無効にするUIKeyboardWillShowNotification
とUIKeyboardWillHideNotification
、アプリ全体でこれらの通知に依存している場合にキーボード通知が送信されなくなります。
ユーザーがUITextFieldまたはキーボードの外側の画面上の任意の場所に触れたときにiOSでキーボードを閉じる方法に関する簡単なヒント。iOSキーボードがどれだけのスペースを取ることができるかを考えると、ユーザーがキーボードを閉じるための簡単で直感的な方法を持つことは理にかなっています。
ここにリンクがあります
これは非常に複雑な答えがたくさんあります。おそらくこれはiOSのドキュメントで簡単に見つけることができないためです。ジョセフはそれを真上に持っていました:
[[view window] endEditing:YES];
Meagarの答えよりもさらに単純
上書きする touchesBegan:withEvent:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[textField resignFirstResponder];`
}
これはdismiss the keyboard
、のどこかにタッチすると発生しますbackground
。
これが私のコードで使用するものです。それは魅力のように機能します!
yourviewcontroller.hに以下を追加します。
@property (nonatomic) UITapGestureRecognizer *tapRecognizer;
.mファイルで、これをViewDidLoad関数に追加します。
- (void)viewDidLoad {
//Keyboard stuff
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapRecognizer];
}
また、この関数を.mファイルに追加します。
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
ビューコントローラーのヘッダーファイル<UITextFieldDelegate>
で、コントローラーのインターフェイスの定義に追加して、UITextFieldデリゲートプロトコルに準拠するようにします...
@interface someViewController : UIViewController <UITextFieldDelegate>
...コントローラーの実装ファイル(.m)に次のメソッドを追加するか、すでにviewDidLoadメソッドがある場合はその中にコードを追加します...
- (void)viewDidLoad
{
// Do any additional setup after loading the view, typically from a nib.
self.yourTextBox.delegate = self;
}
...次に、yourTextBoxを実際のテキストフィールドにリンクします。
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
if (theTextField == yourTextBox) {
[theTextField resignFirstResponder];
}
return YES;
}
ジェレミーの答えは私にはあまりうまくいきませんでした。なぜなら、モーダルダイアログの上にタブビューのナビゲーションスタックがあったからです。現在、以下を使用していますが、問題なく機能しますが、走行距離が異なる場合があります。
// dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord
// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;
// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard { // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard
UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];
UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called. Probably is a way to determine this progragrammatically)
UIViewController *uivc;
if (myRootViewController.navigationController != nil) { // for when there is a nav stack
uivc = myRootViewController.navigationController;
} else {
uivc = myRootViewController;
}
if (uivc.modalViewController != nil) { // for when there is something modal
uivc = uivc.modalViewController;
}
[uivc.view addSubview:tempTextField];
[tempTextField becomeFirstResponder];
[tempTextField resignFirstResponder];
[tempTextField removeFromSuperview];
[tempTextField release];
}
テキストフィールドをサブクラス化し...テキストビューも
サブクラスにこのコードを入れます。
-(void)conformsToKeyboardDismissNotification{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}
-(void)deConformsToKeyboardDismissNotification{
[[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self resignFirstResponder];
}
テキストフィールドデリゲート(テキストビューデリゲートと同様)
-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
[textField conformsToKeyboardDismissNotification];
}
- (void)textFieldDidEndEditing:(JCPTextField *)textField{
[textField deConformsToKeyboardDismissNotification];
}
すべて設定しました。コード内のどこからでも通知を投稿してください。それはキーボードを辞任します。
そして迅速に
UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)
キーボードがポップアップした後でキーボードを閉じるには、2つのケースがあります。
UITextFieldがUIScrollView内にあるとき
UITextFieldがUIScrollViewの外にあるとき
2.UITextFieldがUIScrollViewの外側にある場合、UIViewControllerサブクラスのメソッドをオーバーライドします
すべてのUITextViewのデリゲートも追加する必要があります
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
IBActionを作成するには、Ctrlキーを押しながらUITapGestureをクリックし、それをビューコントローラーの.hファイルにドラッグします。
ここでは、アクション名としてtappedEventという名前を付けています
- (IBAction)tappedEvent:(id)sender {
[self.view endEditing:YES]; }
与えられた情報は次のリンクから導き出されました。詳細については参照するか、情報について理解できない場合は私に連絡してください。
http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/
サブビューを再帰的に反復し、すべてのUITextFieldの配列を格納してから、それらをループしてすべてに再署名できます。
特に多くのサブビューがある場合は特に優れた解決策ではありませんが、単純なアプリの場合はうまくいくはずです。
私はこれをはるかに複雑ですが、はるかにパフォーマンスの高い方法で解決しましたが、アプリのアニメーションエンジンにシングルトン/マネージャーを使用し、テキストフィールドがレスポンダーになるたびに、それをstaticに割り当てて、他の特定のイベントに基づいて一掃された(辞任)...段落で説明することはほとんど不可能です。
この質問を見つけた後、私が自分のアプリについてこれを検討するのに10分しかかかりませんでした。
最近使用する必要があるもう少し堅牢な方法:
- (void) dismissKeyboard {
NSArray *windows = [UIApplication sharedApplication].windows;
for(UIWindow *window in windows) [window endEditing:true];
// Or if you're only working with one UIWindow:
[[UIApplication sharedApplication].keyWindow endEditing:true];
}
他の「グローバル」メソッドの一部が機能しないことがわかりました(たとえば、UIWebView
&WKWebView
辞退を拒否しました)。
タップジェスチャーレコグナイザーをビューに追加します。
あなたの.mファイルは次のようになります
- (IBAction)hideKeyboardGesture:(id)sender {
NSArray *windows = [UIApplication sharedApplication].windows;
for(UIWindow *window in windows) [window endEditing:true];
[[UIApplication sharedApplication].keyWindow endEditing:true];
}
それは私のために働いた
はい、endEditingが最良のオプションです。また、iOW 7.0以降UIScrollView
、スクロールビューの操作時にキーボードを非表示にする優れた機能があります。これを実現するために、のkeyboardDismissMode
プロパティを設定できますUIScrollView
。
キーボードの非表示モードを次のように設定します。
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag
他のタイプはほとんどありません。このアップルのドキュメントをご覧ください。
最も簡単な方法は、メソッドを呼び出すことです
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if(![txtfld resignFirstResponder])
{
[txtfld resignFirstResponder];
}
else
{
}
[super touchesBegan:touches withEvent:event];
}
これらの方法のいずれかを使用する必要があります。
[self.view endEditing:YES];
または
[self.textField resignFirstResponder];