it-swarm-id.com

Bagaimana cara mengundurkan diri responden pertama dari bidang teks ketika pengguna mengetuk di tempat lain?

Saya telah mengisi tampilan saya dengan ScrollView (ukuran yang sama dengan tampilan) dan saya terjebak pada cara untuk mengundurkan diri responden pertama ketika pengguna mengetuk tempat lain di View (atau scrollview). Adakah yang tahu bagaimana melakukannya? Saya menggunakan metode berikut ini tetapi tidak berfungsi seperti yang diharapkan:

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

Terima kasih untuk membantu,

Stephane

24
Steve

Saya menemukan jawaban di sini: tautan

Jika tujuan akhir Anda hanyalah mengundurkan diri dari responden pertama, ini harus bekerja: [self.view endEditing: YES]

Metode ini dirancang tepat untuk itu! .__ Referensi: endEditing:

Menyebabkan tampilan (atau salah satu bidang teks yang disematkan) untuk mengundurkan diri dari status responden pertama.

79
DanSkeel

Untuk solusi yang lebih kuat dan bersih, tambahkan pengenalan gerakan ketuk ke tampilan utama Anda. 

Ini akan bekerja lebih baik dengan tampilan bersarang dan akan lebih bersih daripada tombol rahasia dalam kode dan pembuat UI.

Menurut Anda memang memuat:

UITapGestureRecognizer* tapBackground = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard:)];
[tapBackground setNumberOfTapsRequired:1];
[self.view addGestureRecognizer:tapBackground];

..dan tentukan tindakan target Anda yang akan dipicu saat mengetuk:

-(void) dismissKeyboard:(id)sender
{
    [self.view endEditing:YES];
}
18
Andres Canella

Pilihan terbaik adalah cara terpendek;)

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

Untuk Swift 3 dan Swift 4 Anda dapat melakukan ini:

func viewDidLoad() {
    super.viewDidLoad()

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.hideKeyboardByTappingOutside))

    self.view.addGestureRecognizer(tap)
}

@objc func hideKeyboardByTappingOutside() {
    self.view.endEditing(true)
}
8
pableiros

UIViewController mewarisi dari UIResponder sehingga cara yang naif (saya cukup yakin bukan cara yang paling cerdas untuk melakukannya) adalah dengan menimpa metode berikut (setidaknya 1 dari mereka)

– touchesBegan:withEvent:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
- touchesCancelled:withEvent:

Selanjutnya Anda bisa mendapatkan tampilan tersentuh dengan melakukan

UITouch *touch = [touches anyObject];
UIView *touchedView = [touch view];

akhirnya berhenti responden pertama jika tampilan itu bukan bidang teks Anda

if(touchedView != textField){
    [textField resignFirstResponder];
}

_

Kerugian dari pendekatan ini:

Anda harus menangani "ketuk" sendiri. (Masalah yang sama dengan iOS 3.1 lama atau sebelumnya). Anda harus membuat implementasi sendiri untuk membedakan satu ketukan dari seret, gesekan, ketukan ganda, ketukan panjang, dll. Tidak sulit untuk membuatnya bekerja dengan baik tetapi tidak mungkin Anda mendapatkannya persis seperti Apple mendeteksi ketukan (timing, jarak, ambang batas dihitung!) Namun, itu tergantung pada kebutuhan Anda.

Jika struktur tampilan Anda cukup sederhana maka Anda dapat menambahkan gesture recognition ke tampilan wadah dan mengundurkan diri responden pertama setiap kali pawang dipanggil :)

Semoga ini membantu

4
nacho4d

Belum ada yang memberikan jawaban terbaik di sini:

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

Dari dokumentasi tentang metode ini:

Biasanya, metode ini dipanggil oleh objek UIControl bahwa pengguna telah menyentuh. Implementasi standar mengirim metode tindakan ke objek target yang diberikan atau, jika tidak ada target yang ditentukan, ke yang pertama. responden . Subclass dapat mengganti metode ini untuk melakukan khusus pengiriman pesan tindakan.

Saya berani bagian yang relevan dari paragraf itu. Dengan menentukan nil untuk parameter to:, kami secara otomatis memanggil pemilih yang diberikan pada responden pertama, di mana pun berada, dan kami tidak perlu memiliki pengetahuan tentang di mana dalam hierarki tampilan itu. Ini juga dapat digunakan untuk memanggil metode lain pada responden pertama, tidak hanya menyebabkannya mengundurkan diri dari status responden pertama.

3
Gavin
    -(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [self.TextField resignFirstResponder];

    return YES;
}
3

Berikan Tag unik ke UITextfield Anda (mis. 333), lalu untuk mundur dari responden pertama lakukan ini:

UITextField *textField = (UITextField *)[self.view viewWithTag:333];
[textField resignFirstResponder];
2
Lefteris
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(TapTodissmiss)];

[self.view addGestureRecognizer:tap];

dan pemilih

-(void)TapTodissmiss{

    [self.txtffld resignFirstResponder];

}
1
Ghanshyam Tomar

Cukup buat IBOutlet atau penunjuk ke bidang teks dan panggil [textField resignFirstResponder]; dari mana pun Anda inginkan.

1
Or Ron

Ini adalah cara termudah yang ditemukan yang bekerja secara konsisten. Cukup tambahkan pengenal isyarat ketukan pada tampilan dan Anda siap melakukannya. 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

[self.view endEditing:YES];

}

0
Andrew Cook

Untuk implementasi saya, [self.view endEditing: YES] tidak berfungsi. 

Untuk akhirnya memastikan keyboard disembunyikan, saya harus membuat salah satu pandangan saya menjadi responden pertama, dan kemudian segera membuatnya mengundurkan diri sesuai fungsi di bawah ini:

-(void) hideKeyboardPlease{
   [uiTextTo becomeFirstResponder];
   [uiTextTo resignFirstResponder];
}
0
Lenny

Jika memungkinkan, pilihan terbaik adalah membuat UIView untuk mewarisi dari UIButton sebagai gantinya. 

Anda hanya perlu mengubahnya di Interface Builder dan segera Anda akan mendapatkan opsi untuk membuat Action "Touch Up Inside" seperti tombol lainnya. 

Tampilan Anda akan berfungsi seperti biasa karena UIButton masih berupa tampilan tetapi Anda akan diberi tahu saat seseorang mengetuk tampilan. Di sana Anda dapat menelepon 

[self.view endEditing:YES];

Untuk mengundurkan diri keyboard apa pun.

Harap dicatat bahwa jika tampilan Anda adalah UIScrollView solusi ini bukan untuk Anda.

0
Julio Bailon

Perbarui

Saya menemukan cara sederhana lain 

cukup nyatakan properti: -

@property( strong , nonatomic) UITextfield *currentTextfield;

dan Tap Gesture Gecognizer: -

@property (strong , nonatomic) UITapGestureRecognizer *resignTextField;

Dalam ViewDidLoad

_currentTextfield=[[UITextField alloc]init];
_resignTextField=[[UITapGestureRecognizer alloc]initWithTarget:@selector(tapMethod:)];

[self.view addGestureRecognizer:_resignTextField];

Menerapkan metode delegasi textfield didBeginEditing

 -(void)textFieldDidBeginEditing:(UITextField *)textField{


      _currentTextfield=textField;

    }

Terapkan Metode Gerakan Tap Anda (_resignTextField)

 -(void)tapMethod:(UITapGestureRecognizer *)Gesture{

     [_currentTextfield resignFirstResponder];

 }
0
dreamBegin

Buat IBOutlet Anda di file ViewController.h seperti di bawah ini:

//YOUR ViewController.h FILE

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    //WIRE THIS WITH YOUR UITextField OBJECT AT YOUR .xib FILE
    IBOutlet UITextField *yourIBOutletUITextField;
}

@end

Tambahkan ini ke file ViewController.m Anda:

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

seperti di bawah ini:

//YOUR ViewController.m FILE

#import "ViewController.h"

@implementation ViewController


//ADD THIS METHOD BELOW
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     [yourIBOutletUITextField resignFirstResponder];
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    }

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end
0
EFE

Inilah yang saya lakukan...

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideAllKeyboards)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];

-(void) hideAllKeyboards {
    [textField_1 resignFirstResponder];
    [textField_2 resignFirstResponder];
    [textField_3 resignFirstResponder];
    .
    .
    .
    [textField_N resignFirstResponder];
}
0
Fahim Parkar