プログラムでUITextField
をviewControllerのプロパティにするUITextField
を作成しました。戻ると画面をタッチしてキーボードを閉じる必要があります。画面をタッチして閉じることができましたが、Returnキーを押しても機能しません。
ストーリーボードを使用して、プロパティとして作成せずにUITextField
オブジェクトを直接割り当てて初期化する方法を説明しました。できる?
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITextFieldDelegate>
@property (strong, atomic) UITextField *username;
@end
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor blueColor];
self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
self.username.placeholder = @"Enter your username";
self.username.backgroundColor = [UIColor whiteColor];
self.username.borderStyle = UITextBorderStyleRoundedRect;
if (self.username.placeholder != nil) {
self.username.clearsOnBeginEditing = NO;
}
_username.delegate = self;
[self.view addSubview:self.username];
[_username resignFirstResponder];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"touchesBegan:withEvent:");
[self.view endEditing:YES];
[super touchesBegan:touches withEvent:event];
}
@end
簡単な方法は、UITextField
のデリゲートをself(self.mytestField.delegate = self
)に接続し、[textField resignFirstResponder];
を使用してメソッドtextFieldShouldReturn
のキーボードを閉じることです。
キーボードを閉じる別の方法は次のとおりです。
[self.view endEditing:YES];
キーボードを閉じる場所(ボタンイベント、タッチイベントなど)に[self.view endEditing:YES];
を配置します。
次のようなUITextField
のデリゲートメソッドを追加します。
@interface MyController : UIViewController <UITextFieldDelegate>
textField.delegate = self;
を設定してから、UITextField
の2つのデリゲートメソッドも追加します。
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
return YES;
}
// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
//ビューの背景をタッチしてキーボードを非表示にします
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[[self view] endEditing:YES];
}
swiftでこれを使用して、キーボードを閉じます。
UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)
Swift
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
Swift 4:
self.view.endEditing(true)
または
テキストフィールドのデリゲートを現在のViewControllerに設定してから:
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
目的C:
[self.view endEditing:YES];
または
テキストフィールドのデリゲートを現在のViewControllerに設定してから:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
アプリデリゲートでは、次のように書くことができます
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.window endEditing:YES];
}
この方法を使用すると、あまり多くのコードを書くことはできません。
コードで使用するものは次のとおりです。それは魅力のように機能します!
Yourviewcontroller.hに以下を追加します。
@property (nonatomic) UITapGestureRecognizer *tapRecognizer;
.mファイルで、これをViewDidLoad関数に追加します。
- (void)viewDidLoad {
[super viewDidLoad];
//Keyboard stuff
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapRecognizer];
}
また、この関数を.mファイルに追加します。
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
IOSビュー階層でのファーストレスポンダーとは何かを把握してください。テキストフィールドの内部に触れると(またはプログラムでメッセージにbecomeFirstResponder
を渡すと)テキストフィールドがアクティブになる(または最初のレスポンダー)と、キーボードが表示されます。したがって、テキストフィールドを最初のレスポンダーから削除するには、そこにメッセージresignFirstResponder
を渡す必要があります。
[textField resignFirstResponder];
また、リターンボタンでキーボードを非表示にするには、デリゲートメソッドtextFieldShouldReturn:
を実装し、resignFirstResponder
メッセージを渡す必要があります。
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
UITextView
内のViewController
sのグループの場合:
Swift 3.
for view in view.subviews {
if view is UITextField {
view.resignFirstResponder()
}
}
Objective-C
// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
if ([view isKindOfClass:[UITextField class]]) {
// no need to cast
[view resignFirstResponder];
}
}
キーボードがポップアップした後にキーボードを閉じるには、2つのケースがあります、
uITextFieldがUIScrollView内にある場合
uITextFieldがUIScrollViewの外にある場合
2. UITextFieldがUIScrollViewの外側にある場合、UIViewControllerサブクラスのメソッドをオーバーライドします
また、すべてのUITextViewにデリゲートを追加する必要があります
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
iBActionを作成するには、Ctrlキーを押しながらUITapGestureをクリックし、それをviewcontrollerの.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/
IN Swift
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
または
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == yourtextfieldName
{
self.resignFirstResponder()
self.view.endEditing(true)
}
}
私はこれが他の人によって回答されていることを知っていますが、バックグラウンドイベントもカバーしていない別の記事、tableviewまたはscrollviewを見つけました。
http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/
タグにはiOS iがSwift 1.2およびiOs 8.4の回答を投稿するだけであるため、View ControllerのSwiftクラスにこれらを追加します。
// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
self.view.endEditing(true)
}
// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {
textField.resignFirstResponder()
return true
}
// MARK: -
また、クラス宣言にUITextFieldDelegateを追加し、テキストフィールドデリゲートをself(ビュー)に設定することを忘れないでください。
だから、背景に触れたり戻ったりした後にそれを却下するために私がしたことはここにあります。 viewDidLoadにdelegate = selfを追加し、その後.mファイルにデリゲートメソッドを追加する必要がありました。
.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITextFieldDelegate>
@property (strong, atomic) UITextField *username;
@end
.m
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor blueColor];
self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
self.username.placeholder = @"Enter your username";
self.username.backgroundColor = [UIColor whiteColor];
self.username.borderStyle = UITextBorderStyleRoundedRect;
if (self.username.placeholder != nil) {
self.username.clearsOnBeginEditing = NO;
}
self.username.delegate = self;
[self.username resignFirstResponder];
[self.view addSubview:self.username];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
@end
Objective-Cでこれを使用して、キーボードを閉じます。
[[UIApplication sharedApplication].keyWindow endEditing:YES];
まず、.hファイルにテキストフィールドの委任を追加する必要があります。 (BOOL)textFieldShouldReturn:(UITextField *)textField
が宣言されていない場合、このメソッドは呼び出されません。最初にデリゲートを追加し、キーボードの非表示コードをそのメソッドに書き込みます。
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
これを試してください。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[UITextField class]]) {
[obj resignFirstResponder];
}
}];
}
画面で複数のテキストフィールドを使用する場合
[textField1 resignFirstResponder];
[textField2 resignFirstResponder];
デリゲートの追加:UITextFieldDelegate
@interface ViewController : UIViewController <UITextFieldDelegate>
そして、このデリゲートメソッドを追加します
//これは完全に機能するはずです
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
Swift 2:
これは、あらゆることを行うために行われたものです!
Done
ボタンでキーボードを閉じるか、次の入力に進むにはTouch outSide
、Next
を押します。
まず、StoryBoardでTextFiled Return Key
をNext
に変更します。
override func viewDidLoad() {
txtBillIdentifier.delegate = self
txtBillIdentifier.tag = 1
txtPayIdentifier.delegate = self
txtPayIdentifier.tag = 2
let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
self.view.addGestureRecognizer(tap)
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
if(textField.returnKeyType == UIReturnKeyType.Default) {
if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
next.becomeFirstResponder()
return false
}
}
textField.resignFirstResponder()
return false
}
func onTouchGesture(){
self.view.endEditing(true)
}
現在のView ControllerまたはTextViewがわからない場合は、Responder Chainを使用できます。
UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
for Swift 3-4 iのように修正
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
return false
}
クラスの任意の場所に貼り付けてください。このソリューションは、すべてのUItextfieldを同じように機能させたい場合、または1つしかない場合にのみ機能します!