114

viewController のプロパティをUITextFieldプログラムで作成しました。UITextField画面に戻るとタッチしてキーボードを閉じる必要があります。画面のタッチを閉じることはできましたが、リターンを押しても機能しません。

UITextFieldストーリーボードを使用して、オブジェクトをプロパティとして作成せずに直接割り当てて初期化する方法を見てきました。できる?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#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
4

21 に答える 21

31

UITextField次のようなデリゲート メソッドを追加します。

@interface MyController : UIViewController <UITextFieldDelegate>

そして、あなたを設定し、textField.delegate = self;2つのデリゲートメソッドも追加しますUITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
于 2013-09-12T04:35:10.153 に答える
26

//ビュー内の背景をタッチしてキーボードを非表示にします

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}
于 2014-08-05T07:56:35.113 に答える
9

アプリデリゲートでは、次のように書くことができます

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:YES];
}

この方法を使用すると、あまり多くのコードを記述できなくなります。

于 2015-06-04T10:09:32.783 に答える
7

これが私のコードで使用するものです。それは魅力のように機能します!

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];
}
于 2015-01-07T19:21:34.093 に答える
5

UITextView内の のグループの場合ViewController:

スイフト3.0

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];
    }
}
于 2014-10-01T01:16:08.263 に答える
4

キーボードがポップアップした後にキーボードを閉じるには、2 つのケースがあります。

  1. UITextField がUIScrollView 内にある場合

  2. UITextField がUIScrollView の外にある場合

2. UITextField が UIScrollView の外側にある場合、UIViewController サブクラスのメソッドをオーバーライドします

すべての UITextView のデリゲートも追加する必要があります

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. スクロール ビューでは、外側をタップしてもイベントが発生しないため、その場合は Tap Gesture Recognizer を使用し、スクロール ビューのUITapGestureをドラッグ アンド ドロップしてIBAction を作成します

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/

于 2015-12-02T05:18:26.877 に答える
3

タグは iOS のみを示しているため、Swift 1.2 および iOS 8.4 の回答を投稿します。これらをビュー コントローラーの迅速なクラスに追加します。

// 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 (ビュー) に設定することを忘れないでください。

于 2015-08-06T16:18:05.933 に答える
3

これは他の人から回答があったことは知っていますが、バックグラウンドイベントなし-tableviewまたはscrollviewについてもカバーしている別の記事を見つけました。

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

于 2014-11-20T23:06:06.203 に答える
2

まず、.h ファイルに textfield delegate を追加する必要があります。このメソッドが呼び出されていないと宣言していない場合は、 (BOOL)textFieldShouldReturn:(UITextField *)textField最初にデリゲートを追加し、キーボードの非表示コードをそのメソッドに記述します。

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

これを試してみてください..

于 2013-09-12T04:36:17.540 に答える
2

だから、背景に触れたり戻ったりした後にそれを却下するために私がしたことは次のとおりです。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
于 2013-09-12T21:23:39.953 に答える
0

現在のビュー コントローラーまたはテキストビューがわからない場合は、レスポンダー チェーンを使用できます。

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
于 2016-06-01T10:50:21.337 に答える
0

デリゲートの追加: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

次に、このデリゲート メソッドを追加します

// これは完全に機能するはずです

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
于 2013-09-12T04:53:50.047 に答える
0

スイフト 2 :

これは、あらゆることを行うために行われることです!

次の入力に移動するには、DoneボタンまたはTouch outSideでキーボードを閉じます。Next

まず StoryBoard で TextFiledReturn 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)
}
于 2015-09-14T07:35:19.650 に答える