iOS - UITextField dışına dokunduğunuzda klavyeyi kapat


Yanıtlar:


761

Bir UITapGestureRecognisergörünüm eklemeniz ve görünüme atamanız ve ardından UITextFieldseçicisinin üzerindeki ilk yanıtlayıcıyı çağırmanız gerekir.

Kod:

ViewDidLoad içinde

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

[self.view addGestureRecognizer:tap];

Kapatmada

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

( aTextFieldKlavyeden sorumlu metin alanı nerede )

Swift 3 sürümü böyle görünüyor

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

Kapatma için

@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    aTextField.resignFirstResponder()
}

6
Bu işe yarıyor ancak yaptığı şey, gezinme çubuğu düğmelerinin de devre dışı bırakılması veya devre dışı bırakılması. Bunun için bir çözüm var mı?
Parth Bhatt

137
Ben daha iyi düşünmek [aTextField resignFirstResponder]olurdu [self.view endEditing:YES];bu metin alanı bir başvuru gerekmez ve çoklu textfields için çalışacak
Julian Krol

90
Yani, herhangi bir yöntem tanımlamak zorunda kalmadan, tek bir astar şöyle olurdu:[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
Subhas

8
@ [tap setCancelsTouchesInView:NO];Qiaoyi'nin cevabı başına @ParthBhatt ekledim ; Satır seçimlerine yanıt vermeyen bir tablo ile ilgili bir sorun yaşadım. 5 yıl sonra, umarım bu başka birine yardım eder.
Tom Howard

7
Hızlı bir astar: self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Arıza

176

Birkaç cevap verdim.

Sırasında başlatılan bir ivar kullanın viewDidLoad:

UIGestureRecognizer *tapper;

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

Şu anda ne düzenlediğini reddet:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

Fantastik, UITableView üzerinde çalışıyor !! günümü kurtardı! Yan not olarak [UIView endEditing:] yerine [UITextField resignFirstResponder] kullanacağım çünkü yeni UITextField görünür olsa bile endEditing yanlış kaydırma konumu veriyor.
Dr.Luiji

1
Ölü yanlış çünkü UITapGestureRecognizer hiçbir zaman görünüme eklenmedi!

1
Burada cancelsTouchesInView'in amacı nedir?
Adam Johns

3
Eğer burada cancelsTouchesInView = false eklemezseniz, görünümünüzdeki diğer öğe türlerini seçemezsiniz. Musluklarınıza jestRecognizer tarafından müdahale edilecektir.
HalR

104

Bunu kontrol et, bunu yapmanın en kolay yolu bu olurdu,

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

Veya

Bu kütüphane kaydırma çubuğu otomatik kaydırma, klavyeyi gizlemek için alan vb.

https://github.com/michaeltyson/TPKeyboardAvoiding


@Ramesh evet öyle, ama bu şekilde değil. UITableView'dan bir alt sınıf oluşturmanız ve bu sınıfın içinde touchesBegan yöntemini uygulamanız ve sonra endEditing yöntemini çağırmanız gerekir. işe yarıyor! yeni oluşturulan sınıf ile uçtaki tablonuz için sınıfı ayarlamayı unutmayın.
Prasad De Zoysa

3
Kullanıcı görünümdeki diğer denetimlere dokunduğunda klavyeyi gizlemez. Örn: UIView üzerinde bir UIButton ve UITextField var. Ben UITextField üzerine dokunun, sonra düğmesine dokunun, klavye bu durumda gizlenmez.
Jacob Dam

2
@JacobDam Haklısın. Amaç, aTextField dışında bir şey olursa klavyeyi gizlemek için yanıt veren kişiden istifa etmektir.

88

Bazı insanların UITapGestureRecognizeryöntemi kullanarak sorun yaşadıklarını görüyorum . Mevcut düğmemin dokunma davranışını olduğu gibi bırakırken bu işlevselliği gerçekleştirmenin en kolay yolu @ Jensen2k'nin cevabına yalnızca bir satır eklemektir:

[tap setCancelsTouchesInView:NO];

Bu, mevcut düğmelerimin @Dmitry Sitnikov'un yöntemini kullanmadan çalışmaya devam etmesini sağladı.

Bunun hakkında propertyburadan okuyun (arayın CancelsTouchesInView): UIGestureRecognizer Sınıf Referansı

Bazılarının sorunları olduğunu gördüğüm gibi, kaydırma çubuklarıyla nasıl çalışacağından emin değilim, ama umarım bir başkası benimle aynı senaryoya girebilir.


3
Ben de eklemek istiyorum, kullanarak UIImageView, görünümün arkasında bir arka plan görüntüsü olanlar için , eklemek [imageView setUserInteractionEnabled:NO];ve "tıkırtı", hangi bu yöntemi çalışır.
Paul Peelen

55

Arayüz oluşturucuda UIViewbir örneğinizi oluşturmak UIControlve ardından TouchUpInsideolaylarını dismissKeyboardyönteme bağlamak daha iyidir . Bu IBActionyöntem şöyle görünecektir:

- (IBAction)dismissKeyboard:(id)sender {
    [aTextBox resignFirstResponder];
}

1
Teşekkürler! Bu benim için çalıştı ve diğer çözümler işe yaramadı. ( UITapGestureRecognizergörünümün içindeki düğmelere dokunmakla karıştı). cevaplama zinciri ile touchesEndedbir UIScrollViewkarışıklık olduğu için işe yaramadı .)
jlstrecker

1
Bu harika çalışıyor, ancak klavyeyi kapatmak istediğiniz herhangi bir şeye eklenmelidir. Otomatik olarak bir metin kutusu ilk yanıtlayıcı başka bir şey dokunarak istifa için bir yolu var mı?
Isaac Overacker

4
UIView'i bir UIControl yapmanıza gerek yoktur. UIView'da Kullanıcı Etkileşimi Etkin olduğundan emin olun.
Sofi Software LLC

1
@SofiSoftwareLLC Öneriniz benim için çalışmadı. Kullanıcı Etkileşimi Etkin işaretli olsa bile bunu bir UIControl yapmak zorunda kaldım.
üç fincan

1
Bir StoryBoard kullanarak UIView'i UIControl olarak değiştirdim (burada bir UIView alt sınıfı seçmiştim). İyi çalışıyor. Herhangi bir sorunla karşılaşmadım. iOS8.
ToddB

30

Hızlı 4

UIViewControllerBu uzantı yöntemiyle bir kez kurun , örneğin viewDidLoad:

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

ve klavyeye dokunarak bile kapatılır 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
    }
}

2
Abi, çivilenmiş !! Bu cevap mükemmel ve gerçekten harika çalışıyor, çok teşekkür ederim.
pas

28

Hızlı sürüm, bu diğer öğelerle birlikte çalışır (bir UIButtonveya diğeri gibi UITextField):

override func viewDidLoad() {
    super.viewDidLoad()

    let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
    tapper.cancelsTouchesInView = false
    view.addGestureRecognizer(tapper)
}

1
hedef daha selfziyade olmalıdırself.view
EI Kaptan v2.0

1
hedef self.view olmalıdır. Aksi takdirde, yukarıdaki kod çökecektir.
Naga Mallesh Maddali

canclesTouchesInViewkullanışlı bir özelliktir. Teşekkürler.
JonSlowCN

Eski alışkanlıklar zor bırakılır. Bu noktalı virgül burada ne yapıyor? ;)
Alexandre G.29

@AlexandreG. Gerçekten de, özellikle kodladığımdan beri c#. FYI Bu noktalı virgül sözdizimine izin verilir, sadece gerekli değildir.
Rob

17

Buna ne dersiniz: Bunun eski bir yazı olduğunu biliyorum. Birine yardımcı olabilir :)

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

Herhangi bir girdi türü için çalışır UITextField kontrol etmedi. Herhangi bir sorun görmüyorum.
Frank

15

Bu iyi bir genel çözümdür:

Objective-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 çözümüne dayanarak: https://stackoverflow.com/a/18756253/417652


12

Swift 4 oneliner

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))

Güzel kod, ancak bu silme işlevini devre dışı bırakır (-)
schellingerht

Sen bir dahisin!
Abhishek Bedi

10

Bunu yapmanın en kolay (ve en iyi) yolunun, küresel görüşünüzü alt sınıflara hitTest:withEventayırmak ve herhangi bir dokunuşu dinlemek için yöntemi kullanmak olduğunu düşünüyorum. Klavyedeki dokunuşlar kaydedilmedi, bu yüzden hitTest: withEvent yalnızca başka bir yere / kaydırma / kaydırma / sıkıştırma ... öğesine dokunduğunuzda arayın, sonra arayın [self endEditing:YES].

Bu, kullanmaktan daha iyidir touchesBegançünkü touchesBegangörünümün üstündeki bir düğmeyi tıklarsanız çağrılmaz. UITapGestureRecognizerÖrneğin, kaydırma hareketini tanıyamayacak kadar iyidir . Ayrıca loş bir ekran kullanmaktan daha iyidir, çünkü karmaşık ve dinamik bir kullanıcı arayüzünde loş ekranı her yere koyamazsınız. Ayrıca, diğer eylemleri engellemez, dışarıda bir düğme seçmek için iki kez dokunmanıza gerek yoktur (a durumunda olduğu gibi UIPopover).

Ayrıca, aramaktan daha iyidir [textField resignFirstResponder], çünkü ekranda birçok metin alanınız olabilir, bu yüzden hepsi için çalışır.


Ne yazık ki, bu metni temizlemek için UISearchBar'ın 'X' i engelliyor gibi görünüyor.
huggie

1
bu yaklaşımla ilgili bazı sorunlar var. örneğin, metin alanınıza odaklanmadan kaydırma görünümünü kaydıramazsınız. daha karmaşık senaryolar için tavsiye edilmez ... kişisel olarak, Dmitry uicontrol sürümünü tercih ederim, belki Sofi Software'den gelen coment ile genişletilebilir.
katzenhut

Kaydırma işleminin bir örneği e-posta uygulamasındadır, arama çubuğuna yazıp posta listesini kaydırdığınızda klavye kapatılır.
Enzo Tran

Bu en iyi yaklaşım ve diğer projelerime yapmıştı.
Chandramani


6

Görünüm bir gömülü ise UIScrollView, aşağıdakileri kullanabilirsiniz:

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

Birincisi, tablo görünümü kaydırıldığında klavyenin kapalı ekranını canlandıracak ve daha sonra klavyeyi stok Mesajları uygulaması gibi gizleyecektir.

Bunların iOS 7.0 veya üstü sürümlerde kullanılabildiğini unutmayın.


6

Bunu XCode 6 ve sonraki sürümlerde Storyboard'u kullanarak yapabilirsiniz:


Klavyeyi gizlemek için eylem oluşturun

Bunu ViewController tarafından kullanılan sınıfın başlık dosyasına ekleyin:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

Daha sonra bunu aynı ViewController'ın uygulama dosyasına ekleyin:

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

Bu, şimdi film şeridi sahneniz için 'Alınan İşlemlerden' biri olacak (örn. ViewController):

resim açıklamasını buraya girin


Eylemi kullanıcı etkinliğine bağlama

Şimdi bu eylemi klavyeden dokunma kullanıcı hareketine bağlamanız gerekir.

Önemli - Film şeridinizde bulunan 'UIView'i bir UIControl'e dönüştürmeniz gerekir , böylece olaylar alabilir. Görünüm Denetleyicisi Sahne Alanı hiyerarşisinden görünümü seçin:

resim açıklamasını buraya girin

... ve sınıfını değiştirin:

resim açıklamasını buraya girin

Şimdi, sahneniz için 'alınan eylemin' yanındaki küçük daireden sahnenizin 'boş' bir bölümüne sürükleyin (aslında 'Alınan Eylem'i' UIControl'e sürüklersiniz). Eyleminizi aşağıdakilere bağlayabileceğiniz çeşitli etkinlikler gösterilir:

resim açıklamasını buraya girin

'İçine rötuş' seçeneğini belirtin. Şimdi oluşturduğunuz IBAction'ı klavyeye dokunmak için bir kullanıcı eylemine bağladınız. Kullanıcı klavyeyi kapattığında artık gizlenecektir.

(NOT: Eylemi olaya bağlamak için, alınan eylemden doğrudan Görünüm Denetleyicileri hiyerarşinizde UIControl'e sürükleyebilirsiniz. Hiyerarşide 'Denetim' olarak görüntülenir.)


Çözüm ve ayrıntılı açıklama için teşekkürler. Bana gerçekten yardımcı oldu.
Yongxiang Ruan

5

Eğer seni haklı çıkarsam dışarıya dokunarak klavye istifa etmek istersin textfieldama referansın yok textfield.

Bunu dene;

  • Global textField'i ele alalım, diyelim reftextField
  • Şimdi textFieldDidBeginEditingreferans verilen metin alanını

    - (void) textFieldDidBeginEditing:(UITextField *)textField{
        reftextField = textField;
    }
  • Artık herhangi bir düğme saatinde mutlu bir şekilde kullanabilirsiniz, (önerilen düzenlemeye başlama üzerine şeffaf bir düğme ekleyerek)

    - (void)dismissKeyboard {
          [reftextField resignFirstResponder];
    }
  • Veya bitmiş düğmesini istifa etmek için bunu deneyin.

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

3

Sadece bu listeye eklemek için dış dokunuşta bir klavyeyi kapatmak nasıl benim sürüm.

viewDidLoad:

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

Herhangi bir yer:

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

3

Burada - tüm UITapGestureRecognizermola UITextFieldnet (X) düğmesini kullanma hakkında birçok harika cevap . Çözüm, delege aracılığıyla hareket tanıyıcıyı bastırmaktı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);
}

En sağlam çözüm değil ama benim için çalışıyor.


Aynı metin alanına dokunursam, yukarıdaki her şey başarısız olur. Metin alanı bile benim yanıtlayanım istifa ediyor. ve aynı zamanda TextField içindeki net düğmesine dokunarak klavyeyi kapatır
Mrug

Sadece düğme için testi yaparak basitleştirmek olacaktır: return !touchViewIsButton. Sanırım klavyeyi kapatması gereken diğer düğmeler eylemlerinde bunu yapmalı. Ayrıca, klavye işten çıkarmada düzen değiştiğinde TouchUpInside çağrılamayabilir.
Marián Černý

3

UiView için kategori oluşturabilir ve touchtoBegan meathod'u aşağıdaki gibi geçersiz kılabilirsiniz.

Benim için iyi çalışıyor ve bu sorunun çözümünü merkezileştiriyor.

#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

@ Jensen2k'in cevabının hızlı versiyonu:

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

func dismissKeyboard() {
    aTextField.resignFirstResponder()
}

Bir astar

self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))

2

Barry örneğini yeni gelişimim için kullandım. Harika çalıştı! ancak klavyeyi sadece metin alanı için kapatmak için gerekli olan hafif bir değişiklik eklemek zorunda kaldım.

Barry örneğine aşağıdakileri ekledim:

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

Ayrıca, hideKeyboard yöntemini şu şekilde değiştirdim:

- (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

En kolay ve en kısa yollardan biri, bu kodu viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                     initWithTarget:self.view
                                     action:@selector(endEditing:)]];

2
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

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

     }
}

2

Burada yanıtların çoğunu denedim ve hiç şansım olmadı. Dokunma hareketi tanıyıcı, her UIButtonszaman dokunduğumda, hattacancelsTouchesInView hareket tanıyıcısının özelliğini HAYIR olarak .

Sorunu sonunda çözen de buydu:

Bir ivarınız var:

UITapGestureRecognizer *_keyboardDismissGestureRecognizer;

Bir metin alanı düzenlemeye başladığında, hareket tanıyıcıyı ayarlayın:

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

        [self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
    }
}

Sonra hile dismissKeyboardyöntemi nasıl ayarladığınızdır :

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

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

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

Sanırım sadece dismissKeyboardSelectordokunma işleme yürütme yığını yürütme hakkında bir şey var ...



1

Bu çalışıyor

Bu örnekte, aTextField tek UITextField ... Diğerleri veya UITextViews varsa, yapacak küçük bir şey daha var.

// 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");
}

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];

}

1

Bu kodu ViewController.m dosyanıza ekleyin :

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

1

Bu durumda, ScrollView kullanmak ve TextFieldScrollView içinde eklenebilir ve Ben dokunun ScrollViewve Görünüm sonra Klavyeyi Kapat istiyorum . Her ihtimale karşı örnek kod oluşturmaya çalıştım. Bunun gibi,

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'unuz Tıpkı Like Like'a bakın.

resim açıklamasını buraya girin


1

UITextField dışına tıklayarak klavyeyi kapatmak için UITapGestureRecongnizer yöntemini kullanabilirsiniz. Kullanıcı UITextField dışına tıkladığında bu yöntemi kullanarak klavye işten çıkarılır. Kullanmak için kod snippet'i aşağıdadır.

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

    [self.view addGestureRecognizer:tap];


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

}

1
  • Görünümde yetki verilen metin alanlarını ayarlama yüklendi:

    override func viewDidLoad() 
    {
      super.viewDidLoad()
      self.userText.delegate = self
    }
  • Bu İşlevi Ekle:

    func textFieldShouldReturn(userText: UITextField!) -> Bool 
    {
     userText.resignFirstResponder()
     return true;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.