回答:
私はのデリゲートを設定しUITextField
、私にViewController
クラス。
そのクラスで、このメソッドを次のように実装しました。
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
NO
代わりに戻るのYES
ですか?
NO
テキストに改行を追加しません。
テキストフィールドのDidEndOnExitイベントをInterfaceBuilderのアクション(IBAction)に接続すると、ユーザーがキーボードを閉じると(Returnキーで)メッセージが送信され、送信者はイベントを発生させた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のConnection Inspectorでイベント「Did End On Exit」に接続します。
DidEndOnExit
イベントに登録することで、を呼び出す必要がなくなりますresignFirstResponder
。これは、シンボリックブレークポイントをに置くことでテストできます[UIResponder resignFirstResponder]
。resignFirstResponderを呼び出さなくても、システムによって呼び出されることに注意してください。:これは、マット・ニューバーグの優れた著書(S)で説明されてapeth.com/iOSBook/...
クビ、ありがとう。コードが機能しました。あなたが設定する必要が言うようにだけは、(のような初心者のために)明示的に指定する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;
}
delegate
そこにもテキストフィールドを設定できます。上で示したように、これをプログラムで行う必要はありません。どちらの方法でも問題なく機能します。
コードなしでキーボードを自動的に閉じる動作を実現するための秘訣を次に示します。nibで、IDインスペクターのFirst Responderプロキシオブジェクトを編集し、新しいFirst Responderアクションを追加します。それを呼びましょうdummy:
。次に、テキストフィールドのDid End on Exitイベントをdummy:
First Responderプロキシオブジェクトのアクションにフックします。それでおしまい!テキストフィールドのDid End on Exitイベントにアクションとターゲットのペアがあるため、ユーザーがReturnキーをタップすると、テキストフィールドは自動的にキーボードを閉じます。また、レスポンダーチェーンに送信されたメッセージのハンドラーを見つけられないというペナルティがないため、dummy:
どこにも実装がなくてもアプリはクラッシュしません。
追加するだけ
[textField endEditing:YES];
キーボードを無効にしてピッカービューを表示する場所。
Swift 4.2
そしてそれは100%機能します
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.textField.delegate = self
}
// hide key board when the user touches outside keyboard
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
// user presses return key
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
あなたも使うことができます
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
あなたが多くのUitextfieldを持っているなら最高のもの:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
これが機能するために私がしなければならなかったことは次のとおりです。キーボード用のテンキーを持っている人(または完了ボタンのない他の人)には必要だと思います。
という関数を作成しました
-(IBAction)backgroundIsTapped:(id)sender
これも.hファイルで定義されています。
この後、Interface BuilderでViewControllerの「タッチダウン」ビットにリンクしました。
「バックグラウンドがタップされる」関数には、次のように配置します。
[answerField resignFirstResponder];
「answerField」をキーボードを削除するUITextFieldの名前に変更することを忘れないでください(明らかに、UITextFieldが以下のように定義されていることを確認してください:)
IBOutlet UITextField * <nameoftextfieldhere>;
このトピックはおそらくかなり前に消滅したことを知っています...しかし、これがどこかで誰かを助けることを願っています!
メソッド「textFieldShouldReturn」がDONEキーを押したテキストフィールドオブジェクトを提供することに気づくでしょう。タグを設定すると、そのテキストフィールドをオンにすることができます。または、オブジェクトのポインターを追跡して、作成者が保存したメンバー値と比較することもできます。
私のアプローチは、自習のためのこのようなものです:
- (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:]:キーボードを辞任しました
リターンキーまたはバックグラウンドでのタッチでエディションを終了するための非常にクリーンな方法を次に示します。
Interface Builderで、フィールドをクラスUIFormViewのビューに埋め込みます。
このクラスは何ですか?
ここにコードがあります:
インターフェース
#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でフィールドにデリゲートが設定されている場合、フォームはそれを変更しません。別のデリゲートを特定のフィールドに設定する理由は多くありませんが、なぜ…
このフォームビュークラスを改善するには多くの方法があります-デリゲートのアタッチ、レイアウトの実行、キーボードがフィールドをカバーするときの処理(currentEditingTextFieldフレームを使用)、次のフィールドの編集を自動的に開始、...
私は個人的にそれを自分のフレームワークに保持し、機能を追加するために常にサブクラス化します。これは、「現状のまま」で非常にしばしば役立ちます。
お役に立てば幸いです。乾杯
UIViewControllerでのすべての編集が必要な場合は、使用できます。
[[self view]endEditing:YES];
特定のUITextFieldキーボードを非表示にする場合は、非表示にしてください。
1. viewcontroller.hにデリゲートを追加する
<UITextFieldDelegate>
委任をテキストフィールドにできないようにします。
self.yourTextField.delegate = self;
このメソッドをビューコントローラーに追加します。
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField {[textField resignFirstResponder]; 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
}()
// 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
}
関数hidekeyboardを作成し、それを.xibファイルのテキストフィールドにリンクして、DidEndOnExitを選択します
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}
これを試して
- (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にバインドする必要があることを理解していなかったと思います。