Cara mudah untuk mengabaikan keyboard?

377

Saya memiliki beberapa kontrol yang tersebar di banyak sel tabel di meja saya, dan saya bertanya-tanya apakah ada cara yang lebih mudah untuk mengabaikan keyboard tanpa harus mengulang semua kontrol saya dan mengundurkan semuanya sebagai responden pertama. Saya kira pertanyaannya adalah ... Bagaimana saya mendapatkan responden pertama saat ini ke keyboard?

Seventoes
sumber
pelengkap yang bagus untuk pertanyaan ini: stackoverflow.com/questions/1490573/…
ericsoco
Peringatan untuk semua jawaban di bawah ini. Jika Anda melakukan segue tepat setelah Anda mengundurkan diri dari KB, KB menjadi yatim dan tidak dapat diberhentikan. Anda harus mengabaikan KB dalam metode textFieldShouldReturn.
gjpc
26
pemecatan keyboard global dengan cara yang benar:[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Yerk
Saya menemukan video ini bermanfaat pinkstone.co.uk/… . Mungkin itu bisa membantu orang lain.
Antusiasme

Jawaban:

797

Mencoba:

[self.view endEditing:YES];
Kirby
sumber
1
Ini sepertinya berhasil (diuji pada ios4.1). Padahal itu hanya tersedia di iOS 3.2 ke atas. Saya tidak yakin apakah ini benar-benar dijamin berfungsi, atau hanya efek samping yang tidak dijamin dari memanggil API dengan cara yang tidak didokumentasikan berfungsi.
JosephH
3
Ini bekerja dengan baik untuk saya, dan tentu saja lebih disukai daripada beberapa jawaban lain untuk pertanyaan ini. Dokumen mengatakan itu tersedia di iOS 2.0 dan yang lebih baru.
antsyawn
8
Seperti dokumentasi mengatakan: "Metode ini melihat tampilan saat ini dan hierarki subview untuk bidang teks yang saat ini menjadi responden pertama. Jika menemukannya, ia meminta bidang teks tersebut untuk mengundurkan diri sebagai responden pertama. Jika parameter gaya disetel untuk YA, bidang teks bahkan tidak pernah diminta; itu dipaksa untuk mengundurkan diri. " - jadi ini adalah IMO jawaban yang benar untuk pertanyaan awal (kasus penggunaan: Saya memiliki formulir dengan jutaan bidang, yah - sepuluh ... atau lebih, dan saya harus mengabaikan keyboard).
joshis
14
Jawabannya tidak salah tetapi sedikit salah, sebenarnya seharusnya: [self.view endEditing:YES];karena nilai-nilai BOOL adalah YA / TIDAK di Objective-C.
chrisben
24
chrisben: Anda bisa menggunakan YA / TIDAK, BENAR / SALAH, 0/1.
Michael Superczynski
126

Anda dapat memaksa tampilan pengeditan saat ini untuk mengundurkan diri dengan status responden pertamanya [view endEditing:YES]. Ini menyembunyikan keyboard.

Tidak seperti itu -[UIResponder resignFirstResponder], -[UIView endEditing:]akan mencari melalui subview untuk menemukan responden pertama saat ini. Jadi Anda dapat mengirimnya ke tampilan tingkat atas Anda (mis. self.viewDalam a UIViewController) dan itu akan melakukan hal yang benar.

(Jawaban ini sebelumnya mencakup beberapa solusi lain, yang juga berfungsi tetapi lebih rumit daripada yang diperlukan. Saya telah menghapusnya untuk menghindari kebingungan.)

Nicholas Riley
sumber
Tapi itu hanya akan memblokir komponen dari menjadi firstResponder, tidak menghapus status firstResponder saat ini dari suatu elemen.
Kendall Helmstetter Gelner
Apa yang saya maksud dalam mengesampingkan menjadi FirstResponder untuk menyimpan responden pertama di suatu tempat, sehingga dapat diakses (dalam hal ini, mengundurkan diri) nanti. Masalah mendasarnya adalah bahwa Cocoa Touch tidak menyediakan cara untuk menanyakan jendela atau melihat apa responden pertamanya.
Nicholas Riley
+1 Menambahkan menjadiFirstResponder menyelesaikan masalah yang saya alami dengan mengetuk UITextFields lainnya.
Jason George
3
Ini sudah usang. The [self.view endEditing:YES];jawabannya lebih baik.
ftvs
1
Ini bukan usang, jawaban ini menjelaskan dengan tepat cara [UIView endediting:]kerjanya. Di salah satu aplikasi yang saya kembangkan, kotak pencarian ditambahkan di UINavigationViewController, jika Anda hanya memanggil [self.view endEditing:YES], sebagai selfpengontrol tampilan Anda, ini tidak akan berfungsi, sebagai gantinya, saya memanggil metode ini secara langsung dalam lingkup tampilan tempat kotak pencarian ditambahkan, contoh: [self.mySearchBoxView endEditing:YES].
Jan Cássio
92

Anda dapat mengirim tindakan nihil yang ditargetkan ke aplikasi, itu akan mengundurkan diri responden pertama kapan saja tanpa harus khawatir tentang tampilan yang saat ini memiliki status responden pertama.

Tujuan-C:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

Swift 3.0:

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

Tindakan bertarget nil adalah umum di Mac OS X untuk perintah menu, dan berikut adalah penggunaannya di iOS.

Travelling Man
sumber
14
Solusi terbaik dari seluruh halaman.
Leo Natan
Benar-benar cara terbaik untuk menyingkirkan keyboard dari mana saja di aplikasi iOS.
Ben Sinclair
Masih bekerja untuk saya di iOS8. Dalam aplikasi saya, saya memiliki menu bilah samping, dan ada kalanya pengontrol tampilan "tengah" menampilkan keyboard. Dan saya ingin mengabaikan keyboard jika menu bilah samping akan ditampilkan. Jadi saya menambahkan kode ini di menu bar samping saya Metode viewWillAppear Class.
Jenn Eve
1
Masih berfungsi di iOS 9. Cara yang bagus untuk secara global mengundurkan diri dari fokus bidang teks dan mengabaikan keyboard.
bmjohns
Dan untuk melanjutkan komentar khusus ini .... Masih berfungsi di iOS 10. :-)
Travelling Man
56

Sejujurnya, saya tidak tergila-gila dengan solusi yang diusulkan di sini. Saya memang menemukan cara yang bagus untuk menggunakan TapGestureRecognizer yang menurut saya menjadi inti masalah Anda: Ketika Anda mengklik pada apa pun selain keyboard, abaikan keyboard.

  1. Di viewDidLoad, daftar untuk menerima notifikasi keyboard dan membuat UITapGestureRecognizer:

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
  2. Tambahkan acara keyboard / sembunyikan responden. Di sana Anda menambah dan menghapus TapGestureRecognizer ke UIView yang harus mengabaikan keyboard saat diketuk. Catatan: Anda tidak harus menambahkannya ke semua sub-tampilan atau kontrol.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
  3. TapGestureRecognizer akan memanggil fungsi Anda saat mendapat ketukan dan Anda dapat mengabaikan keyboard seperti ini:

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }

Yang menyenangkan tentang solusi ini adalah hanya menyaring Taps, bukan gesekan. Jadi jika Anda memiliki konten gulir di atas keyboard, gesekan masih akan menggulir dan membiarkan keyboard ditampilkan. Dengan menghapus pengenal isyarat setelah keyboard hilang, ketukan berikutnya pada tampilan Anda ditangani secara normal.

Brett Levine
sumber
Pada @implementation saya, saya menambahkan @property (assign) UITapGestureRecognizer * tapRecognizer; dan memodifikasi self.tapRecognizer = [[Alokasi UITapGestureRecognizer] initWithTarget: self action: @selector (didTapAnywhere :)];
Profesor Todd
Saya mencoba melakukan hal serupa, dan saya tidak menerima panggilan balik. Penasaran: mengapa properti Anda 'ditugaskan'?
TahoeWolverine
Plus satu, dan lebih jauh lagi ini harus menjadi perilaku iOS default. Atau setidaknya tambahkan cara sederhana untuk beralih tombol pemberhentian.
Shaunti Fondrisi
24

Ini adalah solusi untuk membuat keyboard hilang ketika menekan returndi bidang teks apa pun , dengan menambahkan kode di satu tempat (jadi tidak perlu menambahkan penangan untuk setiap bidang teks):


pertimbangkan skenario ini:

saya punya viewcontrollerdengan dua bidang teks (nama pengguna dan kata sandi). dan protokol viewcontrollerimplementasinyaUITextFieldDelegate

saya melakukan ini di viewDidLoad

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}

dan viewcontroller mengimplementasikan metode opsional sebagai

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

dan terlepas dari bidang teks Anda, segera setelah saya menekan returndi keyboard, itu akan diberhentikan!

Dalam kasus Anda, hal yang sama akan berfungsi selama Anda mengatur semua delegasi bidang teks untuk diterapkan dan diterapkan textFieldShouldReturn

prakash
sumber
Yah saya sudah menyelesaikan masalah, tetapi dalam kasus saya, saya ingin mengabaikan keyboard sendiri (dalam kode), dan saya tidak tahu textField mana yang memiliki status responden pertama.
Seventoes
1
Ada beberapa kasus ketika Anda mungkin ingin mengabaikan keyboard tanpa menekan "kembali", misalnya ketika menu sidebar akan ditampilkan
Peter Johnson
Diedit untuk memperjelas bahwa jawaban ini hanya relevan dalam situasi di mana memukul "kembali" adalah solusi yang dapat diterima. [Dalam kasus saya, saya juga ingin mengabaikan keyboard ketika pengguna mengetuk di luar bidang yang sedang diedit; jawaban ini tidak membantu dengan itu.]
ToolmakerSteve
14

Pendekatan yang lebih baik adalah memiliki sesuatu yang "mencuri" status responden pertama.

Karena aplikasi UIA adalah subkelas dari UIResponder, Anda dapat mencoba:

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]

Jika gagal, buat UITextField baru dengan bingkai berukuran nol, tambahkan ke tampilan di suatu tempat dan lakukan hal serupa (diikuti oleh pengunduran diri).

Kendall Helmstetter Gelner
sumber
1
Trik UIApplication tidak berfungsi (crash, setidaknya pada simulator) tetapi Anda tidak memerlukan UITextField berukuran nol - cukup pilih bidang acak apa saja dan lakukan ini dengannya. NSResponder's menjadiFirstResponder adalah metode pemberitahuan saja, namun UIResponder tidak (desainnya lebih buruk, sebenarnya).
Nicholas Riley
1
Aha, terima kasih! Itu crash memanggilnya pada aplikasi UIA tetapi ukuran nol UITextField berfungsi dengan baik, dan saya tidak harus mengambil salah satu bidang saya sebelumnya.
Seventoes
Mengapa ada orang yang melakukan ini jika ada metode resmi, sangat bagus dan terdokumentasi untuk ini?
Maciej Swic
2
Mereka tidak akan, melihat jawaban yang paling dipilih untuk solusi yang lebih baik. Itu tidak diketahui pada saat itu (jawaban saya adalah dari tahun 2009, jawaban yang lain datang lebih dari setahun kemudian di tahun 2010). tapi saya meninggalkannya untuk anak cucu.
Kendall Helmstetter Gelner
8

Menyimpan ini di beberapa kelas utilitas.

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}
lorean
sumber
1
inilah yang saya cari!
aslisabanci
Sempurna, kecuali Anda tidak memerlukan metode globalResignFirstResponderRec sama sekali, panggil saja [view endEditing: YES] sebagai gantinya. Itu melakukan hal yang sama.
n13
Ya! Solusi terakhir! Saya mencoba banyak cara, hanya ini yang bekerja untuk saya! Terima kasih banyak!
douyw
6

@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:

Sangat brilian!

Terima kasih.

Mempertimbangkan saran Anda dan saran orang lain di utas ini, inilah yang telah saya lakukan:

Seperti apa saat digunakan:

[[self appDelegate] dismissKeyboard]; (catatan: Saya menambahkan appDelegate sebagai tambahan untuk NSObject sehingga saya dapat menggunakan apa saja di mana saja)

Seperti apa di bawah tenda:

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}

EDIT

Amandemen jawaban saya untuk dimasukkan tempTextField.enabled = NO;. Menonaktifkan bidang teks akan mencegah UIKeyboardWillShowNotificationdan UIKeyboardWillHideNotificationnotifikasi keyboard dikirim jika Anda mengandalkan notifikasi ini di seluruh aplikasi Anda.

Jeremy
sumber
Saya tidak tahu apakah itu berfungsi, tetapi tampaknya cara yang cerdas dan mudah.
iblis
5

Kiat cepat tentang cara menghilangkan keyboard di iOS ketika pengguna menyentuh di mana saja di layar di luar UITextField atau keyboard. Mempertimbangkan berapa banyak real estat yang dapat diambil oleh keyboard iOS, masuk akal untuk memiliki cara yang mudah dan intuitif bagi pengguna Anda untuk mengabaikan keyboard.

Ini tautannya

Armen
sumber
Bagus! menambahkan ke AppDelegate membuatnya berfungsi untuk SEMUA tampilan terkait.
Jiulong Zhao
5

Banyak jawaban yang terlalu rumit di sini, mungkin karena ini tidak mudah ditemukan di dokumentasi iOS. JosephH tepat di atas:

[[view window] endEditing:YES];
Ian Wilkinson
sumber
4

Bahkan lebih sederhana dari jawaban Meagar

menimpa touchesBegan:withEvent:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [textField resignFirstResponder];`
}

Ini akan dismiss the keyboardketika Anda menyentuh di mana saja di jendela background.

pengguna3032314
sumber
3

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

Di yourviewcontroller.h tambahkan:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

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

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

Juga, tambahkan fungsi ini dalam file .m:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
Bawa
sumber
Terima kasih! Tetapi Anda harus mengganti nama fungsi menjadi 'didTapAnywhere' atau pengenal gesture menjadi 'handleSingleTap' ;-)
Matthijs
2

Dalam file header pengontrol tampilan Anda, tambahkan <UITextFieldDelegate>definisi antarmuka pengontrol Anda agar sesuai dengan protokol delegasi UITextField ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... Dalam file implementasi pengontrol (.m) tambahkan metode berikut, atau kode di dalamnya jika Anda sudah memiliki metode viewDidLoad ...

- (void)viewDidLoad
{
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTextBox.delegate = self;
}

... Lalu, tautkan Kotak Teks Anda ke bidang teks Anda yang sebenarnya

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    if (theTextField == yourTextBox) {
        [theTextField resignFirstResponder];
    }
    return YES;
}
pengguna1270998
sumber
2

Anda harus mengirim endEditing:ke jendela kerja sebagai subclass dariUIView

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];
malex
sumber
Saya yakin maksud Anda YA sebaliknya)
Matrosov Alexander
2

Cara terbaik untuk menghilangkan keyboard dari UITableView dan UIScrollView adalah:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag
Manish Methani
sumber
2

Dalam 3 cepat Anda dapat melakukan hal berikut

UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
KeithC
sumber
1

Jawaban Jeremy tidak cukup untuk saya, saya pikir karena saya memiliki tumpukan navigasi dalam tampilan tab dengan dialog modal di atasnya. Saya menggunakan yang berikut ini sekarang dan berfungsi untuk saya, tetapi jarak tempuh Anda mungkin berbeda.

 // dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord

// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;

// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard {    // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];

    UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called.  Probably is a way to determine this progragrammatically)
    UIViewController *uivc;
    if (myRootViewController.navigationController != nil) { // for when there is a nav stack
        uivc = myRootViewController.navigationController;
    } else {
        uivc = myRootViewController;
    }

    if (uivc.modalViewController != nil) { // for when there is something modal
        uivc = uivc.modalViewController;
    } 

    [uivc.view  addSubview:tempTextField];

    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
    [tempTextField release];

}
JJ Rohrer
sumber
Hmm - mengapa down-vote? Saya membahas kekurangan dunia nyata tertentu dalam jawaban lain dengan kode yang diuji. Saya dapat memahami kurangnya suara, tetapi memilih saya ke wilayah negatif adalah kekecewaan nyata. Saya masih berharap jawaban di atas membantu orang lain.
JJ Rohrer
1

Anda juga mungkin perlu mengganti UIViewController menonaktifkan NonaktifKeyboardDismissal agar ini berfungsi dalam beberapa kasus. Ini mungkin harus dilakukan pada UINavigationController jika Anda memilikinya.

Craig Miller
sumber
1

Subkelas bidang teks Anda ... dan juga tampilan teks

Di subclass masukkan kode ini ..

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

Dalam delegasi bidang teks (mirip untuk delegasi tampilan teks)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

Semua sudah diatur .. Sekarang cukup kirimkan pemberitahuan dari mana saja dalam kode Anda. Ini akan mengundurkan diri keyboard apa pun.

mmmanish
sumber
1

Dan dengan cepat bisa kita lakukan

UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)
Eike
sumber
Saya tidak mengerti bagaimana cara kerja responder pertama .. di mana saya meletakkan ini? di controller pandangan saya atau mendelegasikan?
Shayan C
Tidak masalah. Anda bisa meletakkannya di mana saja Anda mau. yaitu aksi tombol
Eike
1

Untuk mengabaikan keyboard setelah keyboard muncul, ada 2 kasus ,

  1. ketika UITextField berada di dalam UIScrollView

  2. ketika UITextField berada di luar UIScrollView

2. ketika UITextField berada di luar UIScrollView, ganti metode dalam 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 memunculkan acara apa pun , jadi dalam hal itu gunakan Pengenal Ketuk Gerakan , Seret dan letakkan UITapGesture untuk tampilan gulir dan buat IBAction untuk itu .

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

Di sini saya menamai tappedEvent sebagai nama tindakan saya

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

Informasi yang diberikan di atas berasal dari tautan berikut, silakan merujuk untuk informasi lebih lanjut atau hubungi saya jika Anda tidak memahami data di atas.

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


sumber
0

Saya benci bahwa tidak ada cara "global" untuk secara program mengabaikan keyboard tanpa menggunakan panggilan API pribadi. Seringkali, saya harus mengabaikan keyboard secara terprogram tanpa mengetahui objek apa yang menjadi responden pertama. Saya telah memilih untuk memeriksa selfmenggunakan runtime API Objective-C, menghitung melalui semua propertinya, menarik keluar yang bertipe UITextField, dan mengirimkan merekaresignFirstResponder pesan .

Seharusnya tidak sesulit ini untuk melakukan ini ...

CIFilter
sumber
0

Itu tidak cantik, tetapi cara saya mengundurkan diri responden pertama ketika saya tidak tahu apa itu responden:

Buat UITextField, baik dalam IB atau secara terprogram. Jadikan itu Tersembunyi. Tautkan ke kode Anda jika Anda membuatnya di IB. Kemudian, ketika Anda ingin mengabaikan keyboard, Anda mengalihkan responden ke bidang teks yang tidak terlihat, dan segera mengundurkan diri:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];
cannyboy
sumber
0

Anda dapat secara berulang mengulangi melalui subview, menyimpan array dari semua UITextFields, dan kemudian loop melalui mereka dan mengundurkan diri semuanya.

Sebenarnya bukan solusi yang hebat, terutama jika Anda memiliki banyak subview, tetapi untuk aplikasi sederhana itu harus melakukan trik.

Saya memecahkan ini dengan cara yang jauh lebih rumit, tetapi jauh lebih berkinerja, tetapi menggunakan singleton / manajer untuk mesin animasi aplikasi saya, dan setiap kali bidang teks menjadi responden, saya akan menetapkan menetapkannya ke statis yang akan mendapatkan tersapu (mengundurkan diri) berdasarkan peristiwa lain tertentu ... hampir tidak mungkin bagi saya untuk menjelaskan dalam paragraf.

Jadilah kreatif, hanya perlu 10 menit untuk memikirkan ini untuk aplikasi saya setelah saya menemukan pertanyaan ini.

M. Ryan
sumber
Diselesaikan bulan lalu;) Saya akhirnya hanya menyimpan bidang aktif pada fokus dan menggunakannya.
Seventoes
0

Metode yang sedikit lebih kuat yang perlu saya gunakan baru-baru ini:

- (void) dismissKeyboard {
    NSArray *windows = [UIApplication sharedApplication].windows;

    for(UIWindow *window in windows) [window endEditing:true];

    //  Or if you're only working with one UIWindow:

    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Saya menemukan beberapa metode "global" lainnya tidak berfungsi (misalnya, UIWebView& WKWebViewmenolak untuk mengundurkan diri).

mattsven
sumber
0

Tambahkan A Tap Gesture Recognizer ke tampilan Anda. Dan tentukan ibaction

file .m Anda akan seperti

    - (IBAction)hideKeyboardGesture:(id)sender {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in windows) [window endEditing:true];
    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Ini berhasil untuk saya

Murat KAYA
sumber
0

Ya, endEditing adalah pilihan terbaik. Dan Dari iOW 7.0, UIScrollViewmemiliki fitur keren untuk mengabaikan keyboard saat berinteraksi dengan tampilan gulir. Untuk mencapai ini, Anda dapat mengatur keyboardDismissModeproperti UIScrollView.

Tetapkan mode pemberhentian keyboard sebagai:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

Ini memiliki beberapa jenis lainnya. Lihatlah dokumen apel ini .

Shanmugaraja G
sumber
0

Dengan cepat:

self.view.endEditing(true)
YannSteph
sumber
0

cara paling mudah adalah memanggil metode

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    if(![txtfld resignFirstResponder])
    {
        [txtfld resignFirstResponder];
    }
    else
    {

    }
    [super touchesBegan:touches withEvent:event];
}
bharath gangupalli
sumber
Anda tidak perlu 'jika' di sana, resignFirstResponder akan melakukan hal itu. Mungkin maksud Anda - (BOOL) canResignFirstResponder?
Seventoes
0

Anda harus menggunakan salah satu metode ini,

[self.view endEditing:YES];

atau

[self.textField resignFirstResponder];
Vaibhav Shiledar
sumber