iOS - Singkirkan keyboard saat menyentuh di luar UITextField

461

Saya bertanya-tanya bagaimana cara menghapus keyboard ketika pengguna menyentuh bagian luar a UITextField.

Jonepatr
sumber
8
Dmitry memiliki jawaban yang benar. Ini bukan masalah gerakan - ini masalah pengunduran diri responden pertama. Jawaban Dmirty juga merupakan solusi yang direkomendasikan oleh Mark, Nutting dan LeMarche dalam Beginning iOS 4 Development , Bab 4, halaman 83.
jww

Jawaban:

760

Anda harus menambahkan UITapGestureRecogniserdan menetapkannya ke tampilan, lalu panggil pengunduran diri responden pertama pada UITextFieldpemilih di situ.

Kode:

Di viewDidLoad

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];

Di dismissKeyboard:

-(void)dismissKeyboard 
{
    [aTextField resignFirstResponder];
}

(Di mana aTextFieldbidang teks yang bertanggung jawab untuk keyboard)

Versi Swift 3 terlihat seperti itu

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)

Untuk dismisskeyboard

@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    aTextField.resignFirstResponder()
}
Jensen2k
sumber
6
Ini berfungsi tetapi yang dilakukannya adalah juga menonaktifkan atau membuat tombol bilah navigasi tidak dapat diklik. Jadi, apakah ada yang bisa dilakukan untuk ini?
Parth Bhatt
137
Saya pikir lebih baik daripada [aTextField resignFirstResponder]akan [self.view endEditing:YES];hal itu tidak perlu referensi ke bidang teks dan akan bekerja untuk beberapa textfield
Julian Król
90
Jadi tanpa harus mendefinisikan metode apa pun, satu-baris adalah:[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
Subhas
8
@ParthBhatt saya menambahkan [tap setCancelsTouchesInView:NO];per jawaban @qiaoyi; Saya punya masalah dengan tabel yang tidak menanggapi pilihan baris. 5 tahun kemudian, saya harap ini membantu orang lain.
Tom Howard
7
Swift one-liner: self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Kerusakan
176

Saya tumbuk beberapa jawaban.

Gunakan ivar yang diinisialisasi selama viewDidLoad:

UIGestureRecognizer *tapper;

- (void)viewDidLoad
{
    [super viewDidLoad];
    tapper = [[UITapGestureRecognizer alloc]
                initWithTarget:self action:@selector(handleSingleTap:)];
    tapper.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapper];
}

Singkirkan apa yang sedang diedit:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
payah
sumber
Fantastis, ini berfungsi di UITableView !! itu menyelamatkan hariku! Sebagai catatan saya akan menggunakan [UITextField resignFirstResponder] alih-alih [UIView endEditing:] karena saya memiliki lebih banyak UITextField dan endEditing memberikan posisi pengguliran yang salah bahkan jika UITextField baru terlihat.
Dr.Luiji
1
Salah besar karena UITapGestureRecognizer tidak pernah ditambahkan ke tampilan!
1
Apa tujuan dari cancelsTouchesInView di sini?
Adam Johns
3
Jika Anda tidak menambahkan cancelsTouchesInView = false di sini, maka Anda tidak akan dapat memilih jenis item lain dalam tampilan Anda. Keran Anda akan dicegat oleh gestureRecognizer.
HalR
104

Lihat ini, ini akan menjadi cara termudah untuk melakukan itu,

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
      [self.view endEditing:YES];// this will do the trick
}

Atau

Perpustakaan ini akan menangani termasuk pengguliran gulir otomatis, ketuk ruang untuk menyembunyikan keyboard, dll ...

https://github.com/michaeltyson/TPKeyboardAvoiding

Prasad De Zoysa
sumber
@ Ramesh ya, tapi tidak dengan cara ini. Anda perlu membuat subclass dari UITableView dan di dalam kelas itu terapkan metode touchesBegan dan kemudian panggil metode endEditing. berhasil! jangan lupa untuk mengatur kelas untuk tabel Anda di nib dengan kelas yang baru dibuat.
Prasad De Zoysa
3
Itu tidak menyembunyikan keyboard ketika pengguna menyentuh kontrol lain pada tampilan. Mis: Saya punya UIButton dan UITextField di UIView. Saya mengetuk UITextField, lalu mengetuk tombol, keyboard tidak bersembunyi dalam kasus ini.
Jacob Dam
2
@ Jacobam Kamu benar. Tujuannya adalah untuk mengundurkan diri responden untuk menyembunyikan keyboard jika terjadi sesuatu di luar aTextField.
88

Saya melihat bahwa beberapa orang mengalami masalah menggunakan UITapGestureRecognizermetode ini. Cara termudah yang saya lakukan untuk fungsionalitas ini sambil tetap membiarkan perilaku ketuk tombol yang ada tetap utuh adalah dengan menambahkan hanya satu baris ke jawaban @ Jensen2k:

[tap setCancelsTouchesInView:NO];

Ini memungkinkan tombol saya yang ada untuk tetap berfungsi tanpa menggunakan metode @Ditry Sitnikov.

Baca tentang itu di propertysini (cari CancelsTouchesInView): Referensi Kelas UIGestureRecognizer

Saya tidak yakin bagaimana ini akan bekerja dengan scrollbar, karena saya melihat beberapa memiliki masalah dengan, tetapi mudah-mudahan ada orang lain yang mengalami skenario yang sama dengan saya.

Qiao Yi
sumber
3
Saya juga ingin menambahkan, bagi mereka yang memiliki gambar latar belakang di belakang tampilan menggunakan UIImageView, tambahkan [imageView setUserInteractionEnabled:NO];dan Anda "mengklik" itu, yang membuat metode ini berfungsi.
Paul Peelen
55

Lebih baik untuk membuat UIViewinstance Anda UIControl(dalam pembangun antarmuka) dan kemudian menghubungkan TouchUpInsideacara mereka ke dismissKeyboardmetode. IBActionMetode ini akan terlihat seperti:

- (IBAction)dismissKeyboard:(id)sender {
    [aTextBox resignFirstResponder];
}
Dmitry Sitnikov
sumber
1
Terima kasih! Ini bekerja untuk saya dan solusi lain tidak. ( UITapGestureRecognizerMengganggu mengetuk tombol di dalam tampilan). touchesEndedtidak bekerja karena ada yang UIScrollViewmengacaukan rantai responden.)
jlstrecker
1
Ini berfungsi dengan baik, tetapi harus ditambahkan ke apa pun yang Anda ingin mengabaikan keyboard. Apakah ada cara untuk secara otomatis membuat kotak teks mengundurkan diri sebagai responden pertama saat mengetuk yang lain?
Isaac Overacker
4
Anda tidak perlu menjadikan UIView sebagai UIControl. Pastikan UIView memiliki Interaksi Pengguna Diaktifkan.
Sofi Software LLC
1
@SofiSoftwareLLC Saran Anda tidak berhasil untuk saya. Saya harus membuatnya menjadi UIControl bahkan ketika Interaksi Pengguna Diaktifkan diperiksa.
tiga cangkir
1
Menggunakan StoryBoard, saya mengubah UIView menjadi UIControl (di mana saya akan memilih subkelas UIView seandainya saya membuatnya). Ini bekerja dengan baik. Saya belum mengalami masalah apa pun. iOS8.
ToddB
30

Cepat 4

Atur Anda UIViewControllerdengan metode ekstensi ini satu kali misalnya di viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setupHideKeyboardOnTap()
}

dan keyboard akan diberhentikan bahkan dengan mengetuk tombol NavigationBar.

import UIKit
extension UIViewController {
    /// Call this once to dismiss open keyboards by tapping anywhere in the view controller
    func setupHideKeyboardOnTap() {
        self.view.addGestureRecognizer(self.endEditingRecognizer())
        self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())
    }

    /// Dismisses the keyboard from self.view
    private func endEditingRecognizer() -> UIGestureRecognizer {
        let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))
        tap.cancelsTouchesInView = false
        return tap
    }
}
FBente
sumber
2
Bro, kau berhasil !! Jawaban ini sempurna dan bekerja sangat baik, terima kasih banyak.
Karat
28

Versi cepat, ini bekerja dalam kombinasi dengan elemen lain (seperti a UIButtonatau yang lain UITextField):

override func viewDidLoad() {
    super.viewDidLoad()

    let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
    tapper.cancelsTouchesInView = false
    view.addGestureRecognizer(tapper)
}
rampok
sumber
1
Target harus selfdaripadaself.view
EI Captain v2.0
1
target harus self.view. Jika tidak, kode di atas akan macet.
Naga Mallesh Maddali
canclesTouchesInViewadalah properti yang berguna untuk digunakan. Terima kasih.
JonSlowCN
Kebiasaan susah hilang. Apa yang titik koma lakukan di sini? ;)
Alexandre G.
@AlexandreG. Memang, terutama karena saya umumnya coding c#. FYI Tanda titik koma itu diizinkan oleh sintaks, hanya saja tidak perlu.
Rob
17

Bagaimana dengan ini: Saya tahu ini adalah pos lama. Mungkin membantu seseorang :)

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
    NSArray *subviews = [self.view subviews];
    for (id objects in subviews) {
        if ([objects isKindOfClass:[UITextField class]]) {
            UITextField *theTextField = objects;
            if ([objects isFirstResponder]) {
                [theTextField resignFirstResponder];
            }
        } 
    }
}
Tuan H
sumber
Saya tidak memeriksa untuk UITextField sehingga berfungsi untuk semua tipe input. Tidak melihat masalah.
Frank
15

Ini adalah solusi umum yang baik:

Tujuan-C:

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

Cepat:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    self.view.endEditing(true)
}

Berdasarkan solusi @icodebuster: https://stackoverflow.com/a/18756253/417652

eduludi
sumber
12

Oneliner cepat 4

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
Pengembang baru
sumber
Kode yang bagus, tetapi yang ini menonaktifkan fungsi delete (-)
schellingerht
Anda jenius!
Abhishek Bedi
10

Saya pikir cara termudah (dan terbaik) untuk melakukan ini adalah dengan subklas pandangan global Anda dan menggunakan hitTest:withEventmetode untuk mendengarkan sentuhan apa pun. Sentuhan pada keyboard tidak terdaftar, jadi hitTest: withEvent hanya dipanggil saat Anda menyentuh / menggulir / menggesek / mencubit ... di tempat lain, lalu panggil [self endEditing:YES].

Ini lebih baik daripada menggunakan touchesBegankarena touchesBegantidak dipanggil jika Anda mengklik tombol di atas tampilan. UITapGestureRecognizerMisalnya, lebih baik daripada yang tidak bisa mengenali gerakan gulir. Ini juga lebih baik daripada menggunakan layar redup karena dalam antarmuka pengguna yang kompleks dan dinamis, Anda tidak dapat menempatkan layar redup di mana-mana. Selain itu, tidak memblokir tindakan lain, Anda tidak perlu mengetuk dua kali untuk memilih tombol di luar (seperti dalam kasus a UIPopover).

Selain itu, ini lebih baik daripada menelepon [textField resignFirstResponder], karena Anda mungkin memiliki banyak bidang teks di layar, jadi ini berfungsi untuk semuanya.

Enzo Tran
sumber
Sayangnya, ini tampaknya mengganggu 'X' UISearchBar untuk menghapus teks.
huggie
1
ada beberapa masalah dengan pendekatan ini. misalnya, Anda tidak dapat menggulirkan scrollview tanpa kehilangan fokus pada bidang teks Anda. tidak disarankan untuk skenario yang lebih kompleks ... secara pribadi, saya lebih suka versi uicontrol dari Dmitry, mungkin diperpanjang oleh coment dari Sofi Software.
katzenhut
Salah satu contoh pengguliran ada di aplikasi email, ketika Anda mengetik di bilah pencarian dan kemudian menggulir daftar surat, keyboard dihapus.
Enzo Tran
Ini pendekatan terbaik dan telah dilakukan untuk proyek saya yang lain.
Chandramani
6

Jika tampilan tertanam sama sekali dalam UIScrollViewmaka Anda dapat menggunakan yang berikut:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Yang pertama akan menghidupkan keyboard dari layar ketika tampilan tabel digulir dan yang berikutnya akan menyembunyikan keyboard seperti aplikasi Pesan biasa.

Perhatikan bahwa ini tersedia di iOS 7.0 atau lebih tinggi.

Joe Masilotti
sumber
6

Anda dapat melakukan ini menggunakan Storyboard di XCode 6 ke atas:


Buat tindakan untuk menyembunyikan keyboard

Tambahkan ini ke file header kelas yang digunakan oleh ViewController Anda:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

Kemudian tambahkan ini ke file implementasi dari ViewController yang sama:

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

Ini sekarang akan menjadi salah satu 'Tindakan yang Diterima' untuk adegan storyboard Anda (yaitu ViewController):

masukkan deskripsi gambar di sini


Menghubungkan aksi ke acara pengguna

Sekarang Anda perlu menghubungkan tindakan ini dengan gerakan pengguna menyentuh keyboard.

Penting - Anda perlu mengonversi 'UIView' yang terdapat di storyboard Anda ke UIControl , sehingga dapat menerima acara. Pilih tampilan dari hierarki Tampilan Kontroler Anda:

masukkan deskripsi gambar di sini

... dan ubah kelasnya:

masukkan deskripsi gambar di sini

Sekarang seret dari lingkaran kecil di sebelah 'aksi yang diterima' untuk adegan Anda, ke bagian 'kosong' dari adegan Anda (sebenarnya Anda menyeret 'Tindakan yang Diterima' ke UIControl). Anda akan ditunjukkan pilihan acara yang dapat Anda kaitkan dengan:

masukkan deskripsi gambar di sini

Pilih opsi 'touch up inside'. Anda sekarang telah mengaitkan IBAction yang Anda buat ke tindakan pengguna menyentuh keyboard. Ketika pengguna mengetuk keyboard, sekarang akan disembunyikan.

(CATATAN: Untuk mengaitkan tindakan ke acara, Anda juga dapat menyeret dari tindakan yang diterima langsung ke UIControl di hierarki Lihat Pengontrol Anda. Ini ditampilkan sebagai 'Kontrol' dalam hierarki.)

Chris Halcrow
sumber
Terima kasih atas solusinya dan penjelasan terperinci. Sangat membantu saya.
Yongxiang Ruan
5

Jika saya benar, Anda ingin mengundurkan diri dari keyboard tetapi mengetuk bagian luar textfieldtetapi Anda tidak memiliki referensi textfield.

Coba ini;

  • Ambil global TextField, sebut saja reftextField
  • Sekarang di textFieldDidBeginEditingset bidang teks yang dirujuk ke

    - (void) textFieldDidBeginEditing:(UITextField *)textField{
        reftextField = textField;
    }
  • Sekarang Anda dapat dengan senang hati menggunakan pada jam tombol apa saja, (menambahkan tombol transparan pada mulai mengedit direkomendasikan)

    - (void)dismissKeyboard {
          [reftextField resignFirstResponder];
    }
  • Atau untuk pengunduran diri, coba tombol ini.

    //for resigning on done button    
    - (BOOL) textFieldShouldReturn:(UITextField *)textField{
        [textField resignFirstResponder];
        return YES;
    }
rptwsthi
sumber
3

Hanya untuk menambah daftar di sini versi saya tentang cara menghilangkan keyboard di sentuhan luar.

viewDidLoad:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];

Di mana saja:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [textFieldName resignFirstResponder];
    puts("Dismissed the keyboard");
}
John Riselvato
sumber
3

Banyak jawaban yang bagus di sini tentang menggunakan - UITapGestureRecognizersemuanya adalah UITextFieldtombol clear (X) break . Solusinya adalah dengan menekan pengenal gesture melalui delegasinya:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]];
    BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]];
    return !(touchViewIsButton && touchSuperviewIsTextField);
}

Ini bukan solusi yang paling kuat tetapi ini bekerja untuk saya.

skedastik
sumber
Persis, Semua hal di atas gagal jika saya mengetuk bidang teks yang sama. Ia mengundurkan diri bahkan bidang teks adalah responden saya. dan juga menutup keyboard saat mengetuk tombol bening di dalam textField
Mrug
Saya akan menyederhanakan dengan hanya melakukan tes tombol untuk: return !touchViewIsButton. Saya kira tombol-tombol lain yang perlu menghilangkan keyboard harus melakukannya dalam tindakan mereka. Selain itu TouchUpInside mungkin tidak dipanggil saat tata letak berubah pada pemberhentian keyboard.
Marián Černý
3

Anda dapat membuat kategori untuk UiView dan mengganti sentuhan. Mulai meathod sebagai berikut.

Ini berfungsi dengan baik untuk saya. Dan itu adalah solusi terpusat untuk masalah ini.

#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:true];
    [super touchesBegan:touches withEvent:event];
}
@end
Hiren
sumber
3

Versi cepat jawaban @ Jensen2k:

let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)

func dismissKeyboard() {
    aTextField.resignFirstResponder()
}

Satu liner

self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))
Syed Asad Ali
sumber
2

Saya menggunakan contoh Barry untuk pengembangan baru saya. Itu bekerja dengan baik! tetapi saya harus memasukkan sedikit perubahan, diperlukan untuk mengabaikan keyboard hanya untuk bidang teks yang sedang diedit.

Jadi, saya menambahkan ke Barry contoh berikut ini:

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    _textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
    _textBeingEdited = nil;
}

Saya juga mengubah metode hideKeyboard sebagai berikut:

- (IBAction)hideKeyboard:(id)sender
{
    // Just call resignFirstResponder on all UITextFields and UITextViews in this VC
    // Why? Because it works and checking which one was last active gets messy.
    //UITextField * tf = (UITextField *) sender;
    [_textBeingEdited resignFirstResponder];
}
mtorre
sumber
2

Salah satu cara termudah dan terpendek adalah menambahkan kode ini ke viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                     initWithTarget:self.view
                                     action:@selector(endEditing:)]];
Sudhin Davis
sumber
2
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
     view.endEditing(true)

     }
}
Phani Sai
sumber
2

Saya mencoba banyak tanggapan di sini dan tidak berhasil. Pengenal isyarat keran saya selalu menyebabkan saya UIButtonstidak merespons ketika mengetuk, bahkan ketika saya menyetel cancelsTouchesInViewproperti pengenal isyarat ke TIDAK.

Inilah yang akhirnya memecahkan masalah:

Punya ivar:

UITapGestureRecognizer *_keyboardDismissGestureRecognizer;

Saat bidang teks mulai diedit, setel pengenal isyarat:

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    if(_keyboardDismissGestureRecognizer == nil)
    {
        _keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(dismissKeyboard)] autorelease];
        _keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;

        [self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
    }
}

Maka triknya adalah bagaimana Anda mengatur dismissKeyboardmetode:

- (void) dismissKeyboard
{
    [self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}

- (void) dismissKeyboardSelector
{
    [self.view endEditing:YES];

    [self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
    _keyboardDismissGestureRecognizer = nil;
}

Saya kira ada sesuatu tentang mengeluarkan dismissKeyboardSelectoreksekusi dari tumpukan eksekusi penanganan sentuhan ...

pengguna1021430
sumber
1

Kirim pesan resignFirstResponderke file teks yang meletakkannya di sana. Silakan lihat posting ini untuk informasi lebih lanjut.

Ke Sun
sumber
1

Ini bekerja

Dalam contoh ini, aTextField adalah satu-satunya UITextField .... Jika ada yang lain atau UITextViews, ada sedikit hal yang harus dilakukan.

// YourViewController.h
// ...
@interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol
// ...
@end

// YourViewController.m

@interface YourViewController ()
@property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer;
@end
// ...

@implementation
@synthesize singleTapRecognizer = _singleTapRecognizer;
// ...

- (void)viewDidLoad
{
    [super viewDidLoad];
    // your other init code here
    [self.view addGestureRecognizer:self.singleTapRecognizer];

{

- (UITapGestureRecognizer *)singleTapRecognizer
{
    if (nil == _singleTapRecognizer) {
        _singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)];
        _singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events.
    }
    return _singleTapRecognizer;
}

// Something inside this VC's view was tapped (except the navbar/toolbar)
- (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender
{
    NSLog(@"singleTap");
    [self hideKeyboard:sender];
}

// When the "Return" key is pressed on the on-screen keyboard, hide the keyboard.
// for protocol UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
    NSLog(@"Return pressed");
    [self hideKeyboard:textField];
    return YES;
}

- (IBAction)hideKeyboard:(id)sender
{
    // Just call resignFirstResponder on all UITextFields and UITextViews in this VC
    // Why? Because it works and checking which one was last active gets messy.
    [aTextField resignFirstResponder];
    NSLog(@"keyboard hidden");
}

sumber
1
- (void)viewDidLoad
{
    [super viewDidLoad]; 

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
                                                          initWithTarget:self
                                                          action:@selector(handleSingleTap:)];
    [singleTapGestureRecognizer setNumberOfTapsRequired:1];
    [singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer];

    [self.view addGestureRecognizer:singleTapGestureRecognizer];
}

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
    [self.view endEditing:YES];
    [textField resignFirstResponder];
    [scrollView setContentOffset:CGPointMake(0, -40) animated:YES];

}
Gaurav Gilani
sumber
1

Tambahkan kode ini di file ViewController.m Anda :

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}
aashish tamsya
sumber
1

Dalam hal ini, bisa ada menggunakan ScrollView dan ditambahkan ke TextFielddalam ScrollView dan saya ingin Ketuk ScrollViewdan Lihat kemudian Singkirkan Keyboard. Saya mencoba membuat kode sampel untuk berjaga-jaga. Seperti ini,

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
        view.addGestureRecognizer(tapGesture)
        // Do any additional setup after loading the view, typically from a nib.
    }
    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

Storyboard Anda Lihat itu Sama Seperti.

masukkan deskripsi gambar di sini

Ravi Dhorajiya
sumber
1

Anda dapat menggunakan metode UITapGestureRecongnizer untuk mengabaikan keyboard dengan mengklik di luar UITextField. Dengan menggunakan metode ini setiap kali pengguna akan mengklik di luar UITextField maka keyboard akan diberhentikan. Di bawah ini adalah cuplikan kode untuk menggunakannya.

 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                   initWithTarget:self
                                   action:@selector(dismissk)];

    [self.view addGestureRecognizer:tap];


//Method
- (void) dismissk
{
    [abctextfield resignFirstResponder];
    [deftextfield resignFirstResponder];

}
Nirzar Gandhi
sumber
1
  • Tetapkan delegasi bidang teks dalam tampilan yang dimuat:

    override func viewDidLoad() 
    {
      super.viewDidLoad()
      self.userText.delegate = self
    }
  • Tambahkan Fungsi ini:

    func textFieldShouldReturn(userText: UITextField!) -> Bool 
    {
     userText.resignFirstResponder()
     return true;
    }
seggy
sumber