キーボードを閉じたいときにファーストレスポンダーを辞任するようにUITextFieldに指示する必要があることは知っていますが、ユーザーがキーボードの「完了」キーを押したときを知る方法がわかりません。監視できる通知はありますか?
22 に答える
のデリゲートをクラスに設定しまし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の接続インスペクターでイベント「DidEndOnExit」を接続します。
くび、ありがとう。あなたのコードはうまくいきました。あなたが言うように(初心者向けに)明示的にするために、 をテキストフィールドが存在するViewControllerと等しくなるように設定する必要がUITextField
ありdelegate
ます。好きな場所でこれを行うことができます。方法を選びましたviewDidLoad
。
- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}
これは、コードをまったく使用せずにキーボードを自動的に閉じる動作を取得するためのトリックです。nib で、Identity インスペクタで First Responder プロキシ オブジェクトを編集し、新しい First Responder アクションを追加します。と呼びましょうdummy:
。ここで、テキスト フィールドの Did End on Exit イベントをdummy:
First Responder プロキシ オブジェクトのアクションにフックします。それでおしまい!テキスト フィールドの Did End on Exit イベントにはアクションとターゲットのペアがあるため、ユーザーが Return をタップすると、テキスト フィールドは自動的にキーボードを閉じます。また、レスポンダー チェーンに送信されたメッセージのハンドラーが見つからなくてもペナルティはないため、dummy:
どこにも実装がなくてもアプリがクラッシュすることはありません。
追加するだけ
[textField endEditing:YES];
キーボードを無効にしてピッカービューを表示する場所。
Swift では、コントローラに IBAction を記述し、テキスト フィールドのDid End On Exitイベントをそのアクションに設定できます。
@IBAction func returnPressed(sender: UITextField) {
self.view.endEditing(true)
}
これが機能するために私がしなければならなかったことです、そして私はキーボード用のテンキーを持っている人(または完了したボタンのない他の人)にとって必要だと思います:
- ViewControllerのUIViewをUIControlに変更しました。
という関数を作成しました
-(IBAction)backgroundIsTapped:(id)sender
これは、.hファイルでも定義されています。
この後、InterfaceBuilderのViewControllerの「タッチダウン」ビットにリンクしました。
「背景がタップされた」関数に、私はこれを置きます:
[answerField resignFirstResponder];
'answerField'を、キーボードを削除するUITextFieldの名前に変更することを忘れないでください(明らかに、UITextFieldが次のように定義されていることを確認してください:)
IBOutlet UITextField * <nameoftextfieldhere>;
私はこのトピックがおそらくずっと前に死んだことを知っています...しかし、これが誰か、どこかで役立つことを願っています!
メソッド「textFieldShouldReturn」が、DONE キーを押したテキスト フィールド オブジェクトを提供することに気付くでしょう。TAG を設定すると、そのテキスト フィールドをオンに切り替えることができます。または、オブジェクトのポインターを追跡して、その作成者によって保存されたメンバー値と比較することもできます。
自己学習のための私のアプローチは次のようなものです。
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
その間、私は辞任を否定する「検証」テストを以下に置きます。これは説明のためのものなので、ユーザーが 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] いいえ! 13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: キーボードを辞任しました 59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: いいえ 59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: キーボードを辞任しました
UIViewController でのすべての編集が必要な場合は、使用できます。
[[self view]endEditing:YES];
特定の UITextField キーボードを非表示にしたい場合は、使用してください。
1.viewcontroller.h にデリゲートを追加します。
<UITextFieldDelegate>
テキストフィールドへの委任を不可能にします。
self.yourTextField.delegate = self;
このメソッドをビューコントローラーに追加してください。
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField{ [textField rejectFirstResponder]; はいを返します;}
これは、Return キーまたはバックグラウンドでのタッチで編集を終了する非常にクリーンな方法です。
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 でデリゲートが設定されている場合、フォームはそれを変更しません。特定のフィールドに別のデリゲートを設定する理由はあまりないと思いますが、その理由は…</p>
このフォーム ビュー クラスを改善するには、さまざまな方法があります。デリゲートをアタッチする、レイアウトを行う、キーボードがフィールドを覆ったときの処理 ( currentEditingTextField フレームを使用)、次のフィールドの編集を自動的に開始する、などです。
私は個人的にそれを自分のフレームワークに保持しており、機能を追加するために常にサブクラス化しています。「そのまま」で役立つことがよくあります。
役立つことを願っています。乾杯
Swift 3でUITextFieldのデリゲートをプログラムで設定します
ViewController.Swift ファイルに UITextFieldDelegate を実装します (例: class 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
}()
// Mark:- デリゲート 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
}
Interface Builder を使用してビューを作成した場合, 次のメソッドを作成するだけです.
-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}
ビューのテキスト フィールドを右クリックし、イベントを Did End on Exit として設定し、それをメソッド「dismissKeyboard」に接続します。
初心者に最適なガイドは「Head First iPhone and iPad Development, 2nd Edition」です。
関数 hidekeyboard を作成し、それを .xib ファイルのテキスト フィールドにリンクして、DidEndOnExit を選択します。
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}