UITextFieldを編集するときにキーボードをどのように閉じますか
-
07-07-2019 - |
質問
キーボードを非表示にする場合は、UITextFieldに最初のレスポンダーを辞任するよう指示する必要があることは知っていますが、ユーザーが「完了」ボタンを押したタイミングを知る方法がわかりません。キーボードのキー。監視できる通知はありますか?
解決
UITextField
のデリゲートを ViewController
クラスに設定します。
そのクラスでは、このメソッドを次のように実装しました:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
他のヒント
テキストフィールドのDidEndOnExitイベントをInterfaceBuilderのアクション(IBAction)に接続すると、ユーザーがキーボードを(リターンキーで)閉じたときにメッセージが送信され、送信者は発生したUITextFieldへの参照になりますイベント。
例:
-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
次に、InterfaceBuilderで、テキストフィールドのDidEndOnExitイベントをコントローラー上のこのアクション(またはUIからのイベントをリンクするために使用しているもの)にリンクします。ユーザーがテキストを入力してテキストフィールドを閉じるたびに、コントローラーにこのメッセージが送信されます。
コントローラーでメソッドを作成することもできます
-(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}
そしてIBの接続インスペクターで、イベント「終了時に終了しました」を接続します。それに。
クビ、ありがとう。コードは機能しました。あなたが言うように(初心者の場合)明示的にするために、 UITextField
の delegate
をテキストフィールドが存在するViewControllerと等しくなるように設定する必要があります。これはどこでもできます。 viewDidLoad
メソッドを選択しました。
- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}
ここでは、コードをまったく使用せずにキーボードの自動破棄の動作を取得するためのトリックを示します。ペン先で、IDインスペクターのFirst Responderプロキシオブジェクトを編集し、新しいFirst Responderアクションを追加します。 dummy:
と呼びましょう。次に、テキストフィールドの[終了時に終了]イベントを、First Responderプロキシオブジェクトの dummy:
アクションにフックします。それでおしまい!テキストフィールドの「終了時に終了」イベントにはアクションとターゲットのペアがあるため、ユーザーがReturnキーをタップすると、テキストフィールドは自動的にキーボードを閉じます。また、レスポンダチェーンに送信されたメッセージのハンドラを見つけられないことによるペナルティがないため、 dummy:
の実装がどこになくてもアプリはクラッシュしません。
追加するだけ
[textField endEditing:YES];
キーボードを無効にして、ピッカービューを表示する場所。
Swiftでは、コントローラーでIBActionを記述し、テキストフィールドの Exit On Exit イベントをそのアクションに設定できます
@IBAction func returnPressed(sender: UITextField) {
self.view.endEditing(true)
}
使用することもできます
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
Uitextfieldsが多数ある場合に最適:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
これが機能するために私がしなければならなかったことは、キーボード用のナンバーパッドを持っている人(または完了ボタンのない他の人:
- ViewControllerのUIViewをUIControlに変更しました。
-
-(IBAction)backgroundIsTapped:(id)sender
これは.hファイルでも定義されています。
この後、Interface BuilderのViewControllerの「タッチダウン」ビットにリンクしました。
「バックグラウンドがタップされました」機能では、次のようにします:
[answerField resignFirstResponder];
「answerField」を、キーボードを削除するUITextFieldの名前に変更することを忘れないでください(UITextFieldが以下のように定義されていることを確認してください:)
IBOutlet UITextField * <nameoftextfieldhere>;
このトピックはおそらくずっと前に死んだことを知っています...しかし、これが誰かの助けになることを望んでいます!
メソッド&quot; textFieldShouldReturn&quot;に注目してください。 DONEキーを押したテキストフィールドオブジェクトを提供します。 TAGを設定すると、そのテキストフィールドをオンにできます。または、オブジェクトのポインターを追跡して、作成者が保存したメンバー値と比較できます。
自習のための私のアプローチは次のようなものです:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
その間、&quot;検証&quot;辞任を拒否するテストが続きます。説明のためだけなので、ユーザーがNOと入力した場合!フィールドに、それは却下されません。振る舞いは私が望んだとおりでしたが、出力のシーケンスは思ったとおりではありませんでした。
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
以下は、この拒否に対するNSLog出力であり、その後に受け入れられます。私は辞職の結果を返していることに気づくでしょうが、発信者に報告するために私にFALSEを返すことを期待していました!それ以外には、必要な動作があります。
13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 13.327 StudyKbd[109:207] NO! 13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard 59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO 59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
これは、リターンキーまたはバックグラウンドでのタッチでエディションを終了する非常にクリーンな方法です。
Interface Builderで、クラスUIFormViewのビューにフィールドを埋め込みます
このクラスの機能:
- 自分自身をフィールドデリゲートとして自動的にアタッチします(nibから起動されるか、手動で追加されます)
- 現在編集されているフィールドの参照を保持する
- 戻るときにキーボードを閉じるか、バックグラウンドでタッチします
コードは次のとおりです:
インターフェース
#import <UIKit/UIKit.h>
@interface UIFormView : UIView<UITextFieldDelegate>
-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;
@end
実装
#import "UIFormView.h"
@implementation UIFormView
{
UITextField* currentEditingTextField;
}
// Automatically register fields
-(void)addSubview:(UIView *)view
{
[super addSubview:view];
if ([view isKindOfClass:[UITextField class]]) {
if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
}
}
// UITextField Protocol
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
currentEditingTextField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
currentEditingTextField = NULL;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self endEdit];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if ([self textFieldValueIsValid:textField]) {
[self endEdit];
return YES;
} else {
return NO;
}
}
// Own functions
-(void)endEdit
{
if (currentEditingTextField) {
[currentEditingTextField endEditing:YES];
currentEditingTextField = NULL;
}
}
// Override this in your subclass to handle eventual values that may prevent validation.
-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
return YES;
}
@end
-
フォームをサブクラス化して、
textFieldValueIsValid:
メソッド、あなた 指定された値が正しくない場合、エディションの終了を回避できます フィールド。 -
フィールドにInterface Builderでデリゲートが設定されている場合、フォームはそれを変更しません。特定のフィールドに別のデリゲートを設定する多くの理由はわかりませんが、どうして&#8230;
このフォームビュークラスを改善する多くの方法があります-デリゲートをアタッチし、レイアウトを行い、キーボードがフィールドをカバーするときに処理し(currentEditingTextFieldフレームを使用)、次のフィールドの編集を自動的に開始します...
個人的にはフレームワークに保持し、常にサブクラス化して機能を追加します。多くの場合、「現状のまま」で役立ちます。
これが役立つことを願っています。みんな乾杯
使用できるUIViewControllerのすべての編集が必要な場合。
[[self view]endEditing:YES];
また、特定のUITextFieldキーボードを非表示にする場合は非表示にします
1.viewcontroller.hにデリゲートを追加
<UITextFieldDelegate>
-
テキストフィールドに委任できないようにします。
self.yourTextField.delegate = self;
-
ViewControllerにこのメソッドを追加します。
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField { [textField resignFirstResponder]; return YES;}
Swift 3でUITextFieldのデリゲートをプログラムで設定します
ViewController.SwiftファイルにUITextFieldDelegateを実装します(クラスViewController:UIViewController、UITextFieldDelegate {)
lazy var firstNameTF: UITextField = {
let firstname = UITextField()
firstname.placeholder = "FirstName"
firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
firstname.textAlignment = .center
firstname.borderStyle = UITextBorderStyle.roundedRect
firstname.keyboardType = UIKeyboardType.default
firstname.delegate = self
return firstname
}()
lazy var lastNameTF: UITextField = {
let lastname = UITextField()
lastname.placeholder = "LastName"
lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
lastname.textAlignment = .center
lastname.borderStyle = UITextBorderStyle.roundedRect
lastname.keyboardType = UIKeyboardType.default
lastname.delegate = self
return lastname
}()
lazy var emailIdTF: UITextField = {
let emailid = UITextField()
emailid.placeholder = "EmailId"
emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
emailid.textAlignment = .center
emailid.borderStyle = UITextBorderStyle.roundedRect
emailid.keyboardType = UIKeyboardType.default
emailid.delegate = self
return emailid
}()
//マーク:-デリゲートtextFieldの処理。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == firstNameTF {
lastNameTF.becomeFirstResponder()
}
else if textField == lastNameTF {
emailIdTF.becomeFirstResponder()
}
else {
view.emailIdTF(true)
}
return true
}
関数hidekeyboardを作成し、それを.xibファイルのテキストフィールドにリンクして、DidEndOnExitを選択します
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}
Interface Builderを使用してビューを作成した場合は、次を使用します メソッドを作成するだけです
-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}
ビュー内のテキストフィールドを右クリックし、イベントを終了時に[Did End]に設定し、メソッド「dismissKeyboard」に配線します。
初心者向けのベストガイドは &quot; Head First iPhone and iPad Development、2nd Edition&quot;
これを試してください
- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
if ([text isEqualToString:@"\n"]) {
[textView resignFirstResponder];
return NO;
}
return YES;
}
//====================================================
// textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
if(textField.returnKeyType != UIReturnKeyDone){
[[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
}
return YES;
}
Swift 3 を探している人
1) UITextFieldのデリゲートがストーリーボードのViewControllerに接続されていることを確認します
2)ViewController.Swiftファイルに UITextFieldDelegate を実装します(例:クラスViewController:UIViewController、UITextFieldDelegate {)
3)以下のデリゲートメソッドを使用します
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false }
これは私がSwift 4.2でキーボードを閉じる方法であり、私のために機能します:
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action:
#selector(dismissKeyboard))
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
numberField.resignFirstResponder()
}
Swift 3、iOS 9以降
@IBAction private func noteFieldDidEndOnExit(_ sender:UITextField){}
UPD:私にとってはまだうまく機能します。この答えを捧げた人は、ストーリーボードでこのアクションをUITextFieldにバインドする必要があることを理解していなかったと思います。
textField.returnKeyType = UIReturnKeyDone;