Saya bertanya-tanya bagaimana cara menghapus keyboard ketika pengguna menyentuh bagian luar a UITextField
.
Saya bertanya-tanya bagaimana cara menghapus keyboard ketika pengguna menyentuh bagian luar a UITextField
.
Jawaban:
Anda harus menambahkan UITapGestureRecogniser
dan menetapkannya ke tampilan, lalu panggil pengunduran diri responden pertama pada UITextField
pemilih 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 aTextField
bidang 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()
}
[aTextField resignFirstResponder]
akan [self.view endEditing:YES];
hal itu tidak perlu referensi ke bidang teks dan akan bekerja untuk beberapa textfield
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[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.
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
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];
}
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 ...
Saya melihat bahwa beberapa orang mengalami masalah menggunakan UITapGestureRecognizer
metode 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 property
sini (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.
UIImageView
, tambahkan [imageView setUserInteractionEnabled:NO];
dan Anda "mengklik" itu, yang membuat metode ini berfungsi.
Lebih baik untuk membuat UIView
instance Anda UIControl
(dalam pembangun antarmuka) dan kemudian menghubungkan TouchUpInside
acara mereka ke dismissKeyboard
metode. IBAction
Metode ini akan terlihat seperti:
- (IBAction)dismissKeyboard:(id)sender {
[aTextBox resignFirstResponder];
}
UITapGestureRecognizer
Mengganggu mengetuk tombol di dalam tampilan). touchesEnded
tidak bekerja karena ada yang UIScrollView
mengacaukan rantai responden.)
Cepat 4
Atur Anda UIViewController
dengan 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
}
}
Versi cepat, ini bekerja dalam kombinasi dengan elemen lain (seperti a UIButton
atau yang lain UITextField
):
override func viewDidLoad() {
super.viewDidLoad()
let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
tapper.cancelsTouchesInView = false
view.addGestureRecognizer(tapper)
}
self
daripadaself.view
canclesTouchesInView
adalah properti yang berguna untuk digunakan. Terima kasih.
c#
. FYI Tanda titik koma itu diizinkan oleh sintaks, hanya saja tidak perlu.
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];
}
}
}
}
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
Oneliner cepat 4
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
Saya pikir cara termudah (dan terbaik) untuk melakukan ini adalah dengan subklas pandangan global Anda dan menggunakan hitTest:withEvent
metode 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 touchesBegan
karena touchesBegan
tidak dipanggil jika Anda mengklik tombol di atas tampilan. UITapGestureRecognizer
Misalnya, 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.
Ini harus menjadi cara termudah untuk menyembunyikan keyboard Anda dengan menyentuh di luar:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
(dari Cara mengabaikan keyboard saat pengguna mengetuk area lain di luar bidang teks? )
Jika tampilan tertanam sama sekali dalam UIScrollView
maka 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.
Anda dapat melakukan ini menggunakan Storyboard di XCode 6 ke atas:
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):
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:
... dan ubah kelasnya:
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:
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.)
Jika saya benar, Anda ingin mengundurkan diri dari keyboard tetapi mengetuk bagian luar textfield
tetapi Anda tidak memiliki referensi textfield
.
Coba ini;
reftextField
Sekarang di textFieldDidBeginEditing
set 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;
}
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");
}
Banyak jawaban yang bagus di sini tentang menggunakan - UITapGestureRecognizer
semuanya adalah UITextField
tombol 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.
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.
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
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:"))
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];
}
Salah satu cara termudah dan terpendek adalah menambahkan kode ini ke viewDidLoad
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self.view
action:@selector(endEditing:)]];
Saya mencoba banyak tanggapan di sini dan tidak berhasil. Pengenal isyarat keran saya selalu menyebabkan saya UIButtons
tidak merespons ketika mengetuk, bahkan ketika saya menyetel cancelsTouchesInView
properti 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 dismissKeyboard
metode:
- (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 dismissKeyboardSelector
eksekusi dari tumpukan eksekusi penanganan sentuhan ...
Kirim pesan resignFirstResponder
ke file teks yang meletakkannya di sana. Silakan lihat posting ini untuk informasi lebih lanjut.
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");
}
- (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];
}
Tambahkan kode ini di file ViewController.m Anda :
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
Dalam hal ini, bisa ada menggunakan ScrollView dan ditambahkan ke TextField
dalam ScrollView dan saya ingin Ketuk ScrollView
dan 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.
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];
}