Cara menutup keyboard iOS secara terprogram saat menekan kembali

105

Saya membuat secara UITextFieldterprogram membuat UITextFieldproperti dari viewController. Saya perlu menutup keyboard dengan kembali dan sentuhan di layar. Saya bisa mendapatkan sentuhan layar untuk menutup, tetapi menekan kembali tidak berfungsi.

Saya telah melihat bagaimana melakukannya dengan storyboard dan dengan mengalokasikan dan menginisialisasi UITextFieldobjek secara langsung tanpa membuatnya sebagai properti. Bisa dilakukan?

.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
noobsmcgoobs
sumber

Jawaban:

265

Cara sederhana adalah menghubungkan delegasi UITextFieldke self ( self.mytestField.delegate = self) dan menutup keyboard dalam metode yang textFieldShouldReturnmenggunakan[textField resignFirstResponder];

Cara lain untuk menutup keyboard adalah sebagai berikut:

[self.view endEditing:YES];

Letakkan di [self.view endEditing:YES];tempat Anda ingin menutup keyboard (Acara tombol, acara Touch, dll.).

Nitin Gohel
sumber
ketika saya menghubungkan delegasi, saya mendapatkan peringatan dan / atau kesalahan. Saya pernah melihat cara Anda sebelumnya, tetapi karena alasan tertentu tidak dapat membuatnya berfungsi. Apakah metode ini akan masuk dalam viewDidLoad?
noobsmcgoobs
1
Jika Anda mendapatkan kesalahan saat mencoba menyetel delegasi textField ke self, maka Anda mungkin tidak menambahkan UITextFieldDelegate ke definisi kelas. Khususnya ... kelas ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting
29

Tambahkan metode delegasi UITextFieldseperti ini:

@interface MyController : UIViewController <UITextFieldDelegate>

Dan atur textField.delegate = self;lalu tambahkan juga dua metode delegasiUITextField

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

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
iPatel
sumber
Kita harus menambahkan, bahwa di atas hanya berfungsi, jika pengontrol Anda mengimplementasikan UITextFieldDelegate seperti: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK
@iPatel Saya memasukkan 2 metode tersebut, dan juga menambahkan self.username.delegate = self dan [self.username resignFirstResponder] di viewDidLoad. Ini berfungsi untuk kedua skenario yang saya butuhkan. Apakah itu normal atau saya menggunakan terlalu banyak kode?
noobsmcgoobs
26

// Sembunyikan keyBoard dengan menyentuh latar belakang dalam tampilan

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}
Vijay Dokrimare
sumber
24

cukup gunakan ini dengan cepat untuk menutup keyboard:

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

Cepat 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)
Chathuranga Silva
sumber
SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff
17

SWIFT 4:

self.view.endEditing(true)

atau

Setel delegasi bidang teks ke viewcontroller saat ini dan kemudian:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

Objective-C:

[self.view endEditing:YES];

atau

Setel delegasi bidang teks ke viewcontroller saat ini dan kemudian:

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

    return YES;
}
Sam
sumber
9

Di Delegasi Aplikasi, Anda dapat menulis

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

gunakan cara ini, Anda tidak dapat menulis terlalu banyak kode.

DKong
sumber
7

Cobalah untuk mendapatkan gambaran tentang apa itu responden pertama dalam hierarki tampilan iOS. Ketika textfield Anda menjadi aktif (atau first responder) ketika Anda menyentuh di dalamnya (atau menyebarkan pesan secara becomeFirstResponderterprogram), itu menampilkan keyboard. Jadi untuk menghapus textfield Anda dari menjadi responder pertama, Anda harus meneruskan pesan resignFirstResponderke sana.

[textField resignFirstResponder];

Dan untuk menyembunyikan keyboard pada tombol kembali, Anda harus mengimplementasikan metode delegasi textFieldShouldReturn:dan meneruskan resignFirstResponderpesan.

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

Inilah yang saya gunakan dalam kode saya. Ini bekerja seperti pesona!

Di yourviewcontroller.h tambahkan:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Sekarang di file .m, tambahkan ini ke fungsi ViewDidLoad Anda:

- (void)viewDidLoad {
    [super viewDidLoad];

    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Tambahkan juga fungsi ini di file .m:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
Takide
sumber
1
ingat saja tindakannya: @selector harus memanggil nama metode yang sama di mana Anda melakukan endEditing: YES, dalam hal ini "handleSingleTap:"
Marcos Reboucas
4

Untuk menutup keyboard setelah keyboard muncul, ada 2 kasus ,

  1. saat UITextField berada di dalam UIScrollView

  2. saat UITextField berada di luar UIScrollView

2. saat UITextField berada di luar UIScrollView, ganti metode di subkelas UIViewController Anda

Anda juga harus menambahkan delegasi untuk semua UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. Dalam tampilan gulir, Mengetuk di luar tidak akan mengaktifkan acara apa pun , jadi dalam hal ini gunakan Pengenal Gerakan Ketuk , Seret dan lepas UITapGestur untuk tampilan gulir dan buat tindakan IBA untuknya .

untuk membuat IBAction, tekan ctrl + klik UITapGesture dan seret ke file .h viewcontroller.

Di sini saya menamai tappedEvent sebagai nama tindakan saya

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

Informasi yang diberikan secara keseluruhan berasal dari tautan berikut, silakan lihat informasi lebih lanjut atau hubungi saya jika Anda tidak memahami datanya.

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


sumber
Terima kasih. Jawaban Anda membantu saya ..!
Archit Kapoor
4

Untuk sekelompok UITextViews di dalam ViewController:

Swift 3.0.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];
    }
}
Matias Elorriaga
sumber
3

Karena tag hanya mengatakan iOS saya akan memposting jawaban untuk Swift 1.2 dan iOs 8.4, tambahkan ini di kelas swift pengontrol tampilan Anda:

// 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: -

Juga jangan lupa untuk menambahkan UITextFieldDelegate di deklarasi kelas dan setel kolom teks Anda ke self (tampilan).

Juan Boero
sumber
3

DI Swift 3

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

ATAU

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }
Amul4608
sumber
2

Jadi, inilah yang saya lakukan untuk membuatnya ditutup setelah menyentuh latar belakang atau kembali. Saya harus menambahkan delegate = self di viewDidLoad dan kemudian juga metode delegasi nanti di file .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
noobsmcgoobs
sumber
2

Cukup gunakan ini di Objective-C untuk menutup keyboard:

[[UIApplication sharedApplication].keyWindow endEditing:YES];
Linc
sumber
1

Pertama, Anda perlu menambahkan delegete textfield dalam file .h. jika tidak deklarasikan (BOOL)textFieldShouldReturn:(UITextField *)textFieldmetode ini tidak dipanggil. jadi pertama-tama tambahkan delegasi dan tulis kode sembunyikan keyboard ke dalam metode itu.

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

coba yang ini..

Jitendra
sumber
0

Tambahkan Delegasi: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

dan kemudian tambahkan metode delegasi ini

// Ini seharusnya bekerja dengan sempurna

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
Ravi_Parmar
sumber
0
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

bila Anda menggunakan lebih dari satu bidang teks di layar Dengan metode ini Anda tidak perlu menyebutkan bidang teks setiap saat

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];
Harshad
sumber
0

Cepat 2:

inilah yang dilakukan untuk melakukan segala sesuatu!

tutup keyboard dengan Donetombol atau Touch outSide, Nextuntuk ke masukan berikutnya.

Pertama Ubah TextFiled Return KeyKe Nextdi StoryBoard.

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)
}
Mojtabye
sumber
0

Jika Anda tidak mengetahui pengontrol tampilan atau textview saat ini, Anda dapat menggunakan Rantai Responder:

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
api dingin
sumber
0

untuk cepat 3-4 saya tetap suka

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

cukup salin tempel di mana saja di kelas. Solusi ini hanya berfungsi jika Anda ingin semua UItextfield berfungsi sama, atau jika Anda hanya memiliki satu!

hall.keskin
sumber