Returnが押されたときにキーボードを非表示にするUITextFieldのビューがあります。
私の機能はこれです:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ( textField == userPassword ) {
[textField resignFirstResponder];
}
return YES;
}
通常、キーボードは非表示にする必要がありますが、画面上には残ります。 resignFirstResponderが正しく呼び出されます。何が欠けていますか?
これにiPadタグがあるのがわかります。 UIModalPresentationFormSheetを使用してモーダルビューを表示していますか?もしそうなら、これはFormSheetモーダルプレゼンテーションの制限であるように見えます(Appleは何らかの理由で故意にそれを行っているか、それはバグです)詳細については、他の質問を参照してください:
モーダルダイアログを表示するときにキーボードを閉じることができる、この便利な方法があります。
- (BOOL)disablesAutomaticKeyboardDismissal { return NO; }
これにより、Appleで設定されたモーダルダイアログのデフォルトの動作が上書きされ、キーボードを非表示にすることができます。これはUIViewControllerクラスにあります。
これが誰かに役立つことを願っています!
Interface Builderを使用している場合は、UITextFieldにデリゲートがクラスにリンクされているかどうかを確認してください。
-UITextFieldを選択し、ConnectionsのOutlets-> delegateで1つの接続が存在するかどうかを確認します。存在しない場合は、ファイルの所有者クラスに接続します。
これは、ファイルの所有者クラスとリンクする必要があります。このデリゲートは、メソッドを検索する場所を伝えます。メソッドをオーバーライドする場合は、オブジェクトがそれを検索する場所を指定する必要があります。
このソリューションは、上記のどれも実行しなかった後、私にとってはうまくいきました。 resignFirstResponderを呼び出した後、モーダルビューを追加して削除しました。
[myTextField resignFirstResponder];
UIViewController *dummyController = [[UIViewController alloc] init];
UIView *dummy = [[UIView alloc] initWithFrame:CGRectMake(-1, -1,1,1)];
[dummyController setView:dummy];
[self presentModalViewController:dummyController animated:NO];
[dummyController dismissModalViewControllerAnimated:NO];
Brandonによって言及されたバグに対処するために、モーダルビューコントローラーへの参照がまだ残っている限り、モーダルビューコントローラーを閉じて再度開くことを試みることができます。
[textField resignFirstResponder];
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:yourModalViewControllerReference animated:NO];
(「自己」は、モーダルビューコントローラを最初に開いたときに使用したコントローラである必要があります)
xcode 4.5.1
単にコントロールをクリックし、テキストフィールドでドラッグして。hファイルを離します
(コントロールキー+ドラッグ)
次に、ポップアップメニューで
connection=acton;
name= any name;
type=id;
event=did end on exit;
arguments=sender;
次に接続ボタンをクリック
私も同じ問題を抱えていました。デリゲートをInterface Builderでファイルの所有者に接続した後、Interface Builderでの保存を怠っていたことに気付きました。保存した後、再コンパイルすると、Enterキーを押すとキーボードが正しく表示されなくなります。
UITextFieldDelegate
プロトコルを実装することを覚えていますか?
私はこの問題について非常に多くの記事を読みましたが、resignFirstResponder
を呼び出すとオンスクリーンキーボードが非表示になりませんが、どの提案もうまくいきませんでした。
XCode 5(iOS 7)を使用していて、画面キーボードを必要とするいくつかのコントロールを含むiPhone画面がありますが、ユーザーがUIButton
をクリックすると、キーボードが消えます。
resignFirstResponder
を試して1日を無駄にし、NOを返すようにdisablesAutomaticKeyboardDismissal
関数を追加しましたが、何も機能しませんでした。オンスクリーンキーボードが表示されたら、それが二度と消えることはありませんでした。
しかし、私は小さな脳波を持っていました(私は小さな脳しか持っていないため)。
ここで、ユーザーがUIButton
をクリックすると、UITextField
とUITextView
を単にdisableにしますコントロール。
- (IBAction)btnDate_Tapped:(id)sender {
// The user has clicked on the "Date" button.
self.tbClientName.enabled = NO;
self.tbComments.editable = NO;
そして突然、アプリは、画面キーボードを必要とする編集可能なテキストフィールドがないことを発見し、キーボードを見えなくしてきちんとスライドさせます。
(安堵のため息。)
私のUIButton
は実際にポップアップダイアログを表示します。ユーザーがポップアップを閉じると、これら2つのコントロールが再び有効になるので、ユーザーがいずれかをタップすると、キーボードが再び表示されます。
-(void)popoverControllerDidDismissPopover:(UIPopoverController *) popoverController {
// The user has closed our popup dialog.
// We need to make our UITextField and UITextView editable again.
self.tbClientName.enabled = YES;
self.tbComments.editable = YES;
... etc...
}
簡単ですね。
そして驚くべきことに、この回避策はModalスタイルで表示されるUIViewControllers
でも機能します。
これが他のXCode犠牲者の役に立つことを願っています。
最も簡単な方法は次のとおりです。
ユーザーインターフェイスビルダーに移動し、
UITextField
を選択し、「Control-Drag」で「Detail View Controller-Detail」を選択して離します。
ウィンドウがポップアップします。次に、「アウトレット」の下で「デリゲート」を選択します。
それでおしまい。それは私のために働いた。
uIModalPresentationFormSheetにいる場合は、
- (BOOL)disablesAutomaticKeyboardDismissal
{
return NO;
}
フォーカスが移動したように見えるというコメントに基づいて、キーボードが次のテキスト入力フィールドのために開いたままになっている可能性があります。戻りキーが「次へ」キーの場合、textFieldShouldReturn:にYESを返すと、次のtextFieldが最初のレスポンダーになり、キーボードが表示されたままになります。
Swift 3.0:
override var disablesAutomaticKeyboardDismissal: Bool {
get{
return false
}
set {
self.disablesAutomaticKeyboardDismissal = false
}
}
Swift 3.
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField == addressTextField {
textField.resignFirstResponder()
return false
}
return true
}