iOS - UITextField kənarında toxunarkən klaviatura işarəsi

Istifadəçi UITextField kənarına toxunduqda klaviaturanın necə yox olacağına merak edirəm.

422
15 марта '11 в 3:31 2011-03-15 03:31 jonepatr 15 Mart 2011-ci il saat 11: 00-da təyin olunub 2011-03-15 03:31
@ 34 cavab
  • 1
  • 2

Bir UITapGestureRecogniser əlavə etmək və onu görünüşü təyin etmək lazımdır və sonra bu selektorda UITextFieldUITextField üçün ilk UITextField .

Kod:

DidLoad tərəfindən təqdim

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

Dəvətdə:

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

( aTextField klaviatura üçün məsul olan mətn sahəsidir)

Swift 3 versiyası belə görünür:

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

"Reject" funksiyası üçün

 func dismissKeyboard (_ sender: UITapGestureRecognizer) { aTextField.resignFirstResponder() } 
724
15 марта '11 в 3:36 2011-03-15 03:36 cavab Jensen2k mart 15 '11 saat 3:36 2011-03-15 03:36 verilir

Bir neçə cavab yaydım.

viewDidLoad: zamanı viewDidLoad: istifadə edin viewDidLoad:

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

Xahiş edirik ki, indi düzəlişlər edilir:

 - (void)handleSingleTap:(UITapGestureRecognizer *) sender { [self.view endEditing:YES]; } 
169
24 июля '12 в 6:01 2012-07-24 06:01 cavab 24 iyul, saat 12: 00-da saat 12 : 00 -da çəkiləcək

Bunu yoxlayın, bunu etmək üçün ən asan yol olardı,

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

və ya

Bu kitabxana, hərəkət paneli ilə hərəkət etmək, klaviaturanı gizləmək üçün bir yerə və s.

https://github.com/michaeltyson/TPKeyboardAvoiding

100
20 июня '12 в 13:52 2012-06-20 13:52 Cavab 20-dən 12-dək Prasad De Zoysa tərəfindən verilir . 1:52 2012-06-20 13:52

Görürəm ki, bəzi insanlar UITapGestureRecognizer metodundan istifadə edirlər. Bu funksiyanı yerinə yetirərkən ən asan yol, lakin düyməni basdığımda eyni davranışı tərk edib @ Jensen2k cavabına yalnız bir xətt əlavə etməkdir:

 [tap setCancelsTouchesInView:NO]; 

Bu, mövcud düymələrimə @Dmitry Sitnikov metodunu istifadə etməməyə imkan vermirdi.

Bu property burada oxuyun ( CancelsTouchesInView üçün CancelsTouchesInView ): class description UIGestureRecognizer

Bilmirəm ki, bu işin qayçı barlarıyla necə işləməyəcəyinə əminəm, bəzi problemləri var, amma ümid edirəm başqası mənimlə eyni ssenariyə qaça bilər.

83
03 февр. Cavab Qiao Yi tərəfindən verilir 03 fevral. 2012-02-03 20:21 '12 saat 20:21 'da 2012-02-03 20:21

UIControl (builder interfeysində) UIView nümunə etmək daha yaxşıdır və TouchUpInside hadisəsini dismissKeyboard metoduna birləşdirin. Bu IBAction metodu aşağıdakı kimi görünəcək:

 - (IBAction)dismissKeyboard:(id)sender { [aTextBox resignFirstResponder]; } 
55
04 авг. Dmitri Sitnikovun cavabı 04 avqust. 2011-08-04 11:43 '11 'da 11:43' da 2011-08-04 11:43

Sürətli versiya, digər elementlərlə birlikdə işləyir (məsələn, UIButton və ya digər UITextField ):

 override func viewDidLoad() { super.viewDidLoad() let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing)) tapper.cancelsTouchesInView = false view.addGestureRecognizer(tapper) } 
27
06 янв. Cavab yanvarın 06-da Rob tərəfindən verilir 2015-01-06 18:05 '15 at 6:05 pm 2015-01-06 18:05

Bununla əlaqədar olaraq: Mən bu köhnə bir post olduğunu bilirəm. Bu kimsə kömək edə bilər :)

 - (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]; } } } } 
15
04 окт. Hörmətli cənab H 04 Oct. 2011-10-04 08:42 '11 at 8:42 2011-10-04 08:42

Bu yaxşı bir ümumi həlldir:

Məqsəd-C:

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

Swift:

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

@Codebuster həlli əsasında: on123.ru.site/questions/17499 / ...

13
10 окт. cavab verilmişdir Oct 10. 2014-10-10 13:16 '14 at 13:16 2014-10-10 13:16

Swift 4

UIViewController bu genişləndirmə metodunu, məsələn viewDidLoad istifadə edərək, konfiqurasiya edin:

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

klaviatura, hətta NavigationBar basaraq rədd ediləcək.

 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 } } 
11
26 янв. cavab 26 yanvarda FBente tərəfindən verilir . 2018-01-26 16:09 '18 at 4:09 pm 2018-01-26 16:09

Bunu etmək üçün ən asan (və ən yaxşı) bir yoldur hitTest:withEvent Qlobal görünüşünüzünEvent alt sinfi və hitTest:withEvent istifadə hitTest:withEvent hər hansı bir hitTest:withEvent . Klaviatura toxunuşları qeydiyyatdan keçməmişdir, belə ki, hitTest: ilə toxunma / sürüşdürmək / sürüşdürmək / qıfıllama ilə çağırılacaq ... başqa bir yerdə, sonra [self endEditing:YES] .

touchesBegan , touchesBegan istifadə touchesBegan daha yaxşıdır. Bu bir UITapGestureRecognizer dən daha yaxşıdır, məsələn, kaydırıcı bir jest kimi tanına bilməz. Bu, bir dim ekranı istifadə etməkdən də daha yaxşıdır, çünki kompleks və dinamik bir istifadəçi interfeysi hər yerdə dim ekran qura bilməz. Üstəlik, digər hərəkətləri maneə UIPopover , xarici düyməsi ( UIPopover vəziyyətində olduğu kimi) seçmək üçün iki dəfə basmaq lazım deyil.

Ayrıca, [textField resignFirstResponder] çağırışından daha yaxşıdır, çünki ekranda çoxlu mətn sahələri ola bilər, buna görə də bunlar hamısı üçün işləyir.

10
05 янв. Cavab Enzo Tran tərəfindən verilir. 05 yanvar 2012-01-05 19:10 '12 at 19:10 2012-01-05 19:10

Bunu XCode 6 və yuxarıdakı hekayəni istifadə edərək edə bilərsiniz:


Klaviaturanı gizlətmək üçün bir hərəkət yaradın

Bunu ViewController tərəfindən istifadə edilən sinif başlığı faylına əlavə edin:

 @interface TimeDelayViewController : UIViewController <UITextFieldDelegate> - (IBAction)dissmissKeyboardOnTap:(id)sender; @end 

Sonra eyni ViewController tətbiq faylına əlavə edin:

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

İndi hekayə üçün ("ViewController") "hərəkətlərdən" biri olacaq:

2019

16 окт. Oct 16-də johnny tərəfindən verilmiş cavab 2015-10-16 04:47 '15 at 4:47 2015-10-16 04:47

Klaviaturanı gizlətmək üçün ən asan yol olmalıdır:

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

( istifadəçi mətn sahəsinin xaricində başqa bir əraziyə toxunduqda klaviaturadan necə çıxmaq olar? )

6
11 марта '16 в 8:56 2016-03-11 08:56 cavab KoreanXcodeWorker tərəfindən 11 Mart '16 'da 8:56 2016-03-11 08:56' də verilir

UIScrollView -da hər şeyə daxil UIScrollView , aşağıdakılardan istifadə edə bilərsiniz:

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

Birincisi, masa görünüşü kaydırılırken klavyeyi ekrandan animasiya edəcək və daha sonra "Promosyonlar" tətbiqi kimi klaviaturanı gizlədəcəkdir.

Xahiş edirəm ki, onlar iOS 7.0 və ya daha yüksəkdir.

5
14 авг. Joe Masilotti tərəfindən verilən cavabı 14 Av . 2014-08-14 16:05 '14 at 16:05 2014-08-14 16:05

Klaviaturu dəyişmək istədiyini başa düşsəm, outSide mətn sahəsini tıklayırsınız, ancaq mətn sahəsinə link yoxdur.

Bunu sınayın;

  • Qlobal mətn reftextField deyə reftextField
  • İndi textFieldDidBeginEditing mətn sahəsini bağlama ilə təyin edin

     - (void) textFieldDidBeginEditing:(UITextField *)textField{ reftextField = textField; } 
  • İndi hər hansı bir saat düyməsini zövqlə istifadə edə bilərsiniz (düzəliş etmək üçün tövsiyə olunduqda şəffaf bir düyməni əlavə edin)

     - (void)dismissKeyboard { [reftextField resignFirstResponder]; } 
  • Və ya "Bitti" düyməsini dayandırmaq üçün bunu cəhd edin.

     //for resigning on done button - (BOOL) textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; return YES; } 
5
01 марта '13 в 17:51 2013-03-01 17:51 Cavab rptwsthi tərəfindən verilir 01/01/2013 17:51 2013-03-01 17:51

UITapGestureRecognizer istifadə UITapGestureRecognizer bağlı bir çox böyük cavablar var - bunların hamısı aydın (X) UITextField düyməsini UITextField . Çözüm, onun nümayəndəsi vasitəsilə jest tanıyanını bastırmaqdır:

 - (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); } 

Bu ən etibarlı həll deyil, amma mənim üçün çalışır.

3
22 нояб. cavab skedastik 22 noyabrda verilir . 2013-11-22 06:59 '13 'da 6:59' da 2013-11-22 06:59

Cavabın sürətli versiyası @ Jensen2k:

 let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard") self.view.addGestureRecognizer(gestureRecognizer) func dismissKeyboard() { aTextField.resignFirstResponder() } 

Bir liner

 self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:")) 
3
22 апр. Cavab Syed Asad Ali tərəfindən verilir 22 Aprel 2016-04-22 13:16 '16 saat 13:16 'da 2016-04-22 13:16

UiView üçün bir kateqoriya yarada və aşağıdakı kimi meathod toxunmalarını ləğv edə bilərsiniz.

Mənim üçün böyük işləyir. Və bu, bu problemin mərkəzi həllidir.

 #import "UIView+Keyboard.h" @implementation UIView(Keyboard) - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.window endEditing:true]; [super touchesBegan:touches withEvent:event]; } @end 
3
29 окт. Cavab 29 oktyabrda Hiren tərəfindən verilir . 2015-10-29 12:12 '12 ' də saat 12:12' də, 2015-10-29 12:12

Burada xarici toxunma üzərindəki klaviaturanı necə çıxarmaq barədə mənim versiyaya əlavə edin.

viewDidLoad:

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

Hər yerdə:

 -(void)handleSingleTap:(UITapGestureRecognizer *)sender{ [textFieldName resignFirstResponder]; puts("Dismissed the keyboard"); } 
3
17 июля '12 в 3:50 2012-07-17 03:50 Cavab John Riselvato tərəfindən verilir 17 iyul, '12 saat 3:50 2012-07-17 03:50

Ən asan və qısa yollardan biri, bu kodunuzu viewDidLoad a əlavə viewDidLoad

 [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]]; 
2
07 мая '15 в 10:45 2015-05-07 10:45 Cavab Sudhin Davis tərəfindən mayın 07-də ​​saat 15: 45-də verilir 2015-05-07 10:45

Swift 4 oneliner

 view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:)))) 
2
01 июля '18 в 6:13 2018-07-01 06:13 Cavab yeniDeveloper tərəfindən verilir 01 iyul '06 saat 6:13 ; 2018-07-01 06:13

Yeni inkişafım üçün Barry nümunəsini istifadə etdim. Bu böyükdür! lakin klaviaturadan yalnız düzəliş edilə bilən mətn sahəsi üçün rədd etmək üçün lazım olan kiçik bir dəyişiklik etmək məcburiyyətindəyəm.

Beləliklə, Barry-nin nümunəsinə aşağıdakıları əlavə etmişəm:

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

Ayrıca, hideKeyboard metodunu aşağıdakı kimi dəyişdim:

 - (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]; } 
2
19 авг. mtorre 19 avqust cavab verdi . 2013-08-19 02:01 '13 saat 02:01 'da 2013-08-19 02:01

İstifadəyə göndərinFirstResponder mesajını resignFirstResponder qoyan resignFirstResponder göndərin. Daha ətraflı məlumat üçün buraya baxın .

1
15 марта '11 в 3:34 2011-03-15 03:34 Cavab Ke Sun tərəfindən 15 Mart 'da 3:34' də verildi 2011-03-15 03:34
  • Göstərilən mətn sahəsində nümayəndəsi yükləndi:

     override func viewDidLoad() { super.viewDidLoad() self.userText.delegate = self } 
  • Bu funksiyanı əlavə edin:

     func textFieldShouldReturn(userText: UITextField!) -> Bool { userText.resignFirstResponder() return true; } 
1
06 сент. Cavab seggy verilir 06 Sep. 2016-09-06 14:06 '16 at 14:06 2016-09-06 14:06

Bu halda, ScrollView istifadə və ScrollView-TextField əlavə edə bilərsiniz və ScrollView və Aç düyməsini, sonra isə Klaviaturanı ScrollView . Yalnız halda nümunə kodu yaratmağa çalışdım. Bu kimi

 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. } } 

Sizin hekayəçənənizi bəyəndim.

2019

04 июня '16 в 17:16 2016-06-04 17:16 Cavab Ravi Dhorajiya tərəfindən 04 iyun '16' da 17:16 2016-06-04 17:16 'də verilir

UITextGestureRecongnizer metodunu klaviaturadan imtina etmək üçün istifadə edə bilərsiniz, UITextField kənarına gedir. İstifadəçi UITextField-dən kənara çıxdıqda bu metodu istifadə edərək, klaviatura aradan qaldırılacaq. Aşağıda istifadə etmək üçün bir kod parçasıdır.

1
25 сент. Cavab Nirzar Qandi tərəfindən sentyabrın 25-də verilir 2015-09-25 16:37 '15 at 16:37 2015-09-25 16:37

Bu işləyir

Bu nümunədə, aTextField yalnız UITextFielddır .... Başqaları və ya UITextViews varsa, orada bir az daha var.

11 июня '13 в 14:27 2013-06-11 14:27 Cavab Barry tərəfindən 11 iyun 'da 14:27' də verilir 2013-06-11 14:27
 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { if let touch = touches.first{ view.endEditing(true) } } 
1
12 апр. cavab Phani Sai tərəfindən 12 apreldə verilir 2016-04-12 09:10 '16 saat 09:10 'da 2016-04-12 09:10

Burada bir çox cavabı sınamışdım və şanslı deyildim. Mənim toxunma jest cancelsTouchesInView mənim UIButtons heç bir reaksiyaya cavab cancelsTouchesInView , hətta NO cancelsTouchesInView cancelsTouchesInView təyin edərkən.

Nəhayət, problemin həlli nədir:

Ivaru:

 UITapGestureRecognizer *_keyboardDismissGestureRecognizer; 

Mətn sahəsi düzəlişə başlayanda, jest tanıma qurğusunu quraşdırın:

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

Bundan sonra nöqtə, dismissKeyboard metodunu dismissKeyboard :

 - (void) dismissKeyboard { [self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01]; } - (void) dismissKeyboardSelector { [self.view endEditing:YES]; [self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer]; _keyboardDismissGestureRecognizer = nil; } 

Hesab edirəm ki, dismissKeyboardSelector həyata keçirilməsi toxunma emalından dismissKeyboardSelector etməsi dismissKeyboardSelector dismissKeyboardSelector çıxarmaq üçün bir şey var ...

1
15 июня '13 в 0:07 2013-06-15 00:07 Cavab 15 iyun 2014 - il tarixində 0:07 2013-06-15 00:07 istifadəçi tərəfindən verilir

Swift ilə bununla mübarizə edənlər üçün. Bu cavab Jensen2k, lakin Swift-də qəbul edilir.

Swift 2.3

  override func viewDidLoad() { //..... let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:))) //this line is important viewTapGestureRec.cancelsTouchesInView = false self.view.addGestureRecognizer(viewTapGestureRec) //..... } func handleViewTap(recognizer: UIGestureRecognizer) { myTextField.resignFirstResponder() } 
1
27 окт. Cavab 27 oktyabr tarixində verilir . 2016-10-27 21:59 '16 saat 09:59 'da 2016-10-27 21:59
 - (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]; } 
1
19 мая '14 в 10:01 2014-05-19 10:01 Gaurav Gilani'ye 19 May '14 'da 10:01' də cavab verdi 2014-05-19 10:01
  • 1
  • 2

bağlı digər suallar və ya bir sual