iOS - wyłącz klawiaturę, dotykając poza polem UITextField

461

Zastanawiam się, jak sprawić, aby klawiatura zniknęła, gdy użytkownik dotknie poza UITextField.

jonepatr
źródło
8
Dmitry miał poprawną odpowiedź. To nie jest problem gestów - to problem rezygnacji z pierwszego odpowiadającego. Odpowiedź Dmirty'ego to także rozwiązanie zalecane przez Marka, Nuttinga i LeMarche w Beginning iOS 4 Development , Rozdział 4, strona 83.
jww

Odpowiedzi:

760

Musisz dodać UITapGestureRecogniseri przypisać go do widoku, a następnie wywołać rezygnację jako pierwsza osoba odpowiadająca na UITextFieldselektorze.

Kod:

In viewDidLoad

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

[self.view addGestureRecognizer:tap];

Odrzuć klawiaturę:

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

(Gdzie aTextFieldjest pole tekstowe odpowiedzialne za klawiaturę)

Tak wygląda wersja Swift 3

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

Aby zamknąć klawiaturę

func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    aTextField.resignFirstResponder()
}
Jensen2k
źródło
6
Działa to, ale powoduje, że wyłącza lub sprawia, że ​​przyciski paska nawigacyjnego są nieczytelne. Czy jest więc jakieś rozwiązanie?
Parth Bhatt
137
Myślę, że lepiej niż [aTextField resignFirstResponder]by [self.view endEditing:YES];to nie wymagało odniesienia do pola tekstowego i będzie działać na wielu polach tekstowych
Julian Król
90
Więc bez konieczności definiowania jakichkolwiek metod, jeden wiersz byłby:[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
Subhas
8
@ParthBhatt dodałem [tap setCancelsTouchesInView:NO];na odpowiedź @qiaoyi; Miałem problem z tabelą, która nie reagowała na wybrane wiersze. 5 lat później mam nadzieję, że pomoże to komuś innemu.
Tom Howard
7
Szybki liniowy: self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Awaria
176

Zebrałem kilka odpowiedzi.

Użyj ivara, który zostanie zainicjowany podczas viewDidLoad:

UIGestureRecognizer *tapper;

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

Odrzuć to, co jest obecnie edytowane:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
zwięźle
źródło
Fantastycznie, działa na UITableView !! ocali mój dzień! Na marginesie użyję [UITextField resignFirstResponder] zamiast [UIView endEditing:], ponieważ mam więcej UITextField, a endEditing daje złą pozycję przewijania, nawet jeśli nowy UITextField jest widoczny.
Dr.Luiji,
1
Zupełnie źle, ponieważ UITapGestureRecognizer nigdy nie jest dodawany do widoku!
1
Jaki jest cel CancelsTouchesInView tutaj?
Adam Johns
3
Jeśli nie dodasz tutaj cancelsTouchesInView = false, nie będziesz mógł wybrać innych typów elementów w swoim widoku. Twoje krany zostaną przechwycone przez gestRecognizer.
HalR
104

Sprawdź to, to byłby najłatwiejszy sposób, aby to zrobić,

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

Lub

Ta biblioteka będzie obsługiwać automatyczne przewijanie paska przewijania, dotknij spacji, aby ukryć klawiaturę itp.

https://github.com/michaeltyson/TPKeyboardAvoiding

Prasad De Zoysa
źródło
@ Ramesh tak, ale nie w ten sposób. musisz utworzyć podklasę z UITableView, a wewnątrz tej klasy zaimplementować metodę touchesBegan, a następnie wywołać metodę endEditing. to działa! nie zapomnij ustawić klasy dla swojego stołu w stalówce z nowo utworzoną klasą.
Prasad De Zoysa
3
Nie ukrywa klawiatury, gdy użytkownik dotyka innych kontrolek w widoku. Np .: Mam UIButton i UITextField na UIView. Stukam w UITextField, a następnie stukam w przycisk, w tym przypadku klawiatura się nie chowa.
Jacob Dam
2
@JacobDam Masz rację. Celem jest zrezygnowanie z pierwszego korespondenta, aby ukryć klawiaturę, jeśli coś się wydarzy poza polem tekstowym.
88

Widzę, że niektórzy ludzie mają problemy z użyciem tej UITapGestureRecognizermetody. Najłatwiejszym sposobem, w jaki osiągnąłem tę funkcjonalność, pozostawiając nienaruszone zachowanie mojego przycisku w stanie nienaruszonym, jest dodanie tylko jednej linii do odpowiedzi @ Jensen2k:

[tap setCancelsTouchesInView:NO];

Dzięki temu moje istniejące przyciski nadal działały bez użycia metody @Dmitry Sitnikov.

Przeczytaj o tym propertytutaj (szukaj CancelsTouchesInView): Odwołanie do klasy UIGestureRecognizer

Nie jestem pewien, jak to będzie działać z paskami przewijania, ponieważ widzę, że niektórzy mieli problemy, ale mam nadzieję, że ktoś inny może spotkać się z tym samym scenariuszem, co ja.

Qiao Yi
źródło
3
Chciałbym również dodać, dla tych, którzy mają obraz tła z tyłu widoku za pomocą UIImageView, dodaj, [imageView setUserInteractionEnabled:NO];a ty „klikniesz” go, co sprawia, że ​​ta metoda działa.
Paul Peelen,
55

Lepiej jest utworzyć UIViewinstancję UIControl(w programie do tworzenia interfejsów), a następnie połączyć ich TouchUpInsidezdarzenie z dismissKeyboardmetodą. Ta IBActionmetoda będzie wyglądać następująco:

- (IBAction)dismissKeyboard:(id)sender {
    [aTextBox resignFirstResponder];
}
Dmitrij Sitnikow
źródło
1
Dzięki! To działało dla mnie, a inne rozwiązania nie. ( UITapGestureRecognizerprzeszkadzało to w naciskaniu przycisków w widoku). touchesEndednie działał, ponieważ wystąpił UIScrollView
bałagan w
1
Działa to świetnie, ale musi być dodane do wszystkiego, co chcesz zdjąć klawiaturę. Czy istnieje sposób, aby pole tekstowe automatycznie zrezygnowało z pierwszej odpowiedzi po stuknięciu czegoś innego?
Izaak Overacker
4
Nie powinno być konieczne, aby UIView był UIControl. Upewnij się, że UIView ma włączoną interakcję użytkownika.
Sofi Software LLC,
1
@OfiSoftwareLLC Twoja sugestia nie działała dla mnie. Musiałem zrobić to UIControl, nawet gdy zaznaczono opcję Włączoną interakcję użytkownika.
trzy puchary
1
Za pomocą StoryBoard zmieniłem UIView na UIControl (gdzie wybrałbym podklasę UIView, gdybym ją stworzył). To dobrze działa. Nie napotkałem żadnych problemów. iOS8.
ToddB
30

Szybki 4

Skonfiguruj UIViewControllertę metodę rozszerzenia raz, np. W viewDidLoad:

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

a klawiatura zostanie zwolniona nawet po dotknięciu przycisku 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
    }
}
FBente
źródło
2
Bracie, przybiłeś to !! Ta odpowiedź jest idealna i działa naprawdę świetnie, dziękuję bardzo.
rdza
28

Wersja szybka, działa w połączeniu z innymi elementami (takimi jak UIButtoninne UITextField):

override func viewDidLoad() {
    super.viewDidLoad()

    let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
    tapper.cancelsTouchesInView = false
    view.addGestureRecognizer(tapper)
}
Obrabować
źródło
1
celem powinien być selfzamiastself.view
EI Captain v2.0
1
celem powinien być self.view. W przeciwnym razie powyższy kod ulegnie awarii.
Naga Mallesh Maddali,
canclesTouchesInViewto przydatna właściwość do użycia. Dzięki.
JonSlowCN
Stare zwyczaje umierają ciężko. Co tu robi ten średnik? ;)
Alexandre G.
@AlexandreG. Rzeczywiście, zwłaszcza że ogólnie koduję c#. Do Twojej wiadomości: Średnik jest dozwolony pod względem składni, po prostu nie jest konieczny.
Rob
17

Co powiesz na to: wiem, że to stary post. Może komuś pomóc :)

- (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];
            }
        } 
    }
}
Pan H.
źródło
Nie sprawdziłem UITextField, więc działa na każdym typie danych wejściowych. Nie widzę żadnego problemu.
Frank
15

To dobre ogólne rozwiązanie:

Cel C:

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

Szybki:

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

W oparciu o rozwiązanie @icodebuster: https://stackoverflow.com/a/18756253/417652

eduludi
źródło
12

Swift 4 oneliner

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
newDeveloper
źródło
Niezły kod, ale ten wyłącza funkcję usuwania (-)
schellingerht
Jesteś geniuszem!
Abhishek Bedi
10

Myślę, że najłatwiejszym (i najlepszym) sposobem na zrobienie tego jest podklasowanie globalnego widoku i użycie hitTest:withEventmetody słuchania dowolnego dotyku. Dotyki na klawiaturze nie są rejestrowane, więc hitTest: withEvent jest wywoływany tylko po dotknięciu / przewinięciu / przesunięciu / ściśnięciu ... gdzie indziej, a następnie zadzwonić [self endEditing:YES].

Jest to lepsze niż używanie, touchesBeganponieważ touchesBegannie są wywoływane, jeśli klikniesz przycisk u góry widoku. Jest to lepsze niż, na przykład, UITapGestureRecognizerktóry nie może rozpoznać gestu przewijania. Jest to również lepsze niż używanie przyciemnionego ekranu, ponieważ w złożonym i dynamicznym interfejsie użytkownika nie można wszędzie umieścić przyciemnionego ekranu. Co więcej, nie blokuje innych działań, nie musisz stuknąć dwa razy, aby wybrać przycisk na zewnątrz (jak w przypadku a UIPopover).

Jest to także lepsze niż dzwonienie [textField resignFirstResponder], ponieważ na ekranie może znajdować się wiele pól tekstowych, więc działa to na wszystkie z nich.

Enzo Tran
źródło
Niestety wydaje się to kolidować z „X” UISearchBar w celu wyczyszczenia tekstu.
huggie,
1
z tym podejściem wiążą się pewne problemy. na przykład nie można przewijać widoku przewijania bez utraty koncentracji na polu tekstowym. nie wskazane w przypadku bardziej skomplikowanych scenariuszy ... osobiście wolę wersję uicontrol od Dmitry'ego, być może rozszerzoną o pochwałę od Sofi Software.
katzenhut
Jednym z przykładów przewijania jest aplikacja do obsługi poczty e-mail. Gdy piszesz w pasku wyszukiwania, a następnie przewijasz listę poczty, klawiatura jest odrzucana.
Enzo Tran
To najlepsze podejście i zrobiłem z innymi projektami.
Chandramani,
6

Jeśli widok jest w ogóle osadzony w UIScrollView, możesz użyć następujących opcji:

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

Pierwsza z nich będzie animować klawiaturę poza ekranem, gdy przewijany jest widok tabeli, a później ukryje klawiaturę, podobnie jak standardowa aplikacja Wiadomości.

Pamiętaj, że są one dostępne w systemie iOS 7.0 lub nowszym.

Joe Masilotti
źródło
6

Możesz to zrobić za pomocą Storyboard w XCode 6 i nowszych:


Utwórz akcję, aby ukryć klawiaturę

Dodaj to do pliku nagłówka klasy używanej przez twój ViewController:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

Następnie dodaj to do pliku implementacji tego samego ViewController:

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

Będzie to teraz jedna z „Otrzymanych akcji” dla sceny scenorysu (tj. ViewController):

wprowadź opis zdjęcia tutaj


Podłącz akcję do zdarzenia użytkownika

Teraz musisz połączyć to działanie z gestem użytkownika polegającym na oderwaniu się od klawiatury.

Ważne - Musisz przekonwertować „UIView” zawarty w twojej serii ujęć na UIControl , aby mógł odbierać zdarzenia. Wybierz widok z hierarchii Scena kontrolera widoku:

wprowadź opis zdjęcia tutaj

... i zmień klasę:

wprowadź opis zdjęcia tutaj

Teraz przeciągnij z małego kółka obok „odebranej akcji” dla swojej sceny na „pustą” część sceny (w rzeczywistości przeciągasz „Otrzymaną akcję” do UIControl). Zobaczysz wybór wydarzeń, które możesz podłączyć do:

wprowadź opis zdjęcia tutaj

Wybierz opcję „retusz wewnątrz”. Teraz podłączyłeś utworzoną IBAction do akcji polegającej na dotykaniu klawiatury. Gdy użytkownik stuknie klawiaturę, teraz będzie ukryta.

(UWAGA: Aby dołączyć akcję do zdarzenia, możesz również przeciągnąć z odebranej akcji bezpośrednio do UIControl w hierarchii kontrolerów widoku. Jest ona wyświetlana jako „Kontrola” w hierarchii.)

Chris Halcrow
źródło
Dzięki za rozwiązanie i szczegółowe wyjaśnienie. Naprawdę mi pomocny.
Yongxiang Ruan,
5

Jeśli dobrze zrozumiałem, chcesz zrezygnować z dotykania klawiatury po zewnętrznej stronie, textfieldale nie masz swojego odniesienia textfield.

Spróbuj tego;

  • Weź globalny textField, nazwijmy go reftextField
  • Teraz w textFieldDidBeginEditingustawionym polu tekstowym odniesienia do

    - (void) textFieldDidBeginEditing:(UITextField *)textField{
        reftextField = textField;
    }
  • Teraz możesz z radością korzystać z dowolnego przycisku zegara (zalecane dodanie przezroczystego przycisku przy rozpoczęciu edycji)

    - (void)dismissKeyboard {
          [reftextField resignFirstResponder];
    }
  • Lub zrezygnuj z przycisku gotowe, spróbuj tego.

    //for resigning on done button    
    - (BOOL) textFieldShouldReturn:(UITextField *)textField{
        [textField resignFirstResponder];
        return YES;
    }
rptwsthi
źródło
3

Wystarczy dodać do listy tutaj moją wersję, jak odrzucić klawiaturę na zewnątrz.

viewDidLoad:

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

Gdziekolwiek:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [textFieldName resignFirstResponder];
    puts("Dismissed the keyboard");
}
John Riselvato
źródło
3

Mnóstwo świetnych odpowiedzi na temat używania - UITapGestureRecognizerw tym wszystkich UITextFieldprzycisków zerowania (X). Rozwiązaniem jest stłumienie rozpoznawania gestów za pośrednictwem jego delegata:

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

To nie jest najbardziej niezawodne rozwiązanie, ale działa dla mnie.

skedastik
źródło
Dokładnie, wszystkie powyższe rzeczy zawodzą, jeśli dotknę tego samego pola tekstowego. Rezygnuje nawet pole tekstowe jest moją odpowiedzią. a także zamyka klawiaturę po dotknięciu wyraźnego przycisku w polu tekstowym
Mrug
Chciałbym uprościć go po prostu robi test na przycisk: return !touchViewIsButton. Sądzę, że wszelkie inne przyciski, które muszą zwolnić klawiaturę, powinny to robić w swoich działaniach. Ponadto TouchUpInside może nie zostać wywołany, gdy zmieni się układ po zwolnieniu klawiatury.
Marián Černý
3

Możesz utworzyć kategorię dla UiView i przesłonić szlak Rozpocznij meathod w następujący sposób.

Działa dla mnie dobrze i jest scentralizowanym rozwiązaniem tego problemu.

#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:true];
    [super touchesBegan:touches withEvent:event];
}
@end
Dzierżawa
źródło
3

Szybka wersja odpowiedzi @ Jensen2k:

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

func dismissKeyboard() {
    aTextField.resignFirstResponder()
}

Jedna wkładka

self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))
Syed Asad Ali
źródło
2

Użyłem przykładu Barry do mojego nowego projektu. Działa świetnie! ale musiałem wprowadzić niewielką zmianę, wymaganą do zwolnienia klawiatury tylko dla edytowanego pola tekstowego.

Dodałem więc do przykładu Barry:

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

Zmieniłem również metodę hideKeyboard w następujący sposób:

- (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];
}
mtorre
źródło
2

Jednym z najłatwiejszych i najkrótszych sposobów jest dodanie tego kodu do swojego viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                     initWithTarget:self.view
                                     action:@selector(endEditing:)]];
Sudhin Davis
źródło
2
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

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

     }
}
Phani Sai
źródło
2

Próbowałem tutaj wielu odpowiedzi i nie miałem szczęścia. Mój rozpoznawanie gestów dotknij zawsze powodowało, że UIButtonsnie reagowałem po stuknięciu, nawet gdy ustawiłem cancelsTouchesInViewwłaściwość rozpoznawania gestów na NIE.

Oto, co ostatecznie rozwiązało problem:

Mieć ivar:

UITapGestureRecognizer *_keyboardDismissGestureRecognizer;

Gdy pole tekstowe zacznie się edytować, ustaw rozpoznawanie gestów:

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

        [self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
    }
}

Zatem sztuczka polega na tym, jak skonfigurować dismissKeyboardmetodę:

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

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

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

Wydaje mi się, że jest coś w dismissKeyboardSelectorwydobywaniu wykonania ze stosu wykonawczego obsługi dotykowej ...

użytkownik1021430
źródło
1

To działa

W tym przykładzie aTextField jest jedynym UITextField ... Jeśli są inne lub UITextViews, jest trochę więcej do zrobienia.

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

źródło
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];

}
Gaurav Gilani
źródło
1

Dodaj ten kod do pliku ViewController.m :

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}
aashish tamsya
źródło
1

W takim przypadku można użyć ScrollView i dodać do TextFieldScrollView i chcę Stuknij ScrollViewi Widok, a następnie Zamknij klawiaturę. Na wszelki wypadek próbowałem utworzyć przykładowy kod. Lubię to,

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

Twój Storyboard Spójrz na to tak jak.

wprowadź opis zdjęcia tutaj

Ravi Dhorajiya
źródło
1

Możesz użyć metody UITapGestureRecongnizer do odrzucenia klawiatury, klikając poza polem UITextField. Korzystając z tej metody, ilekroć użytkownik kliknie poza UITextField, klawiatura zostanie zwolniona. Poniżej znajduje się fragment kodu umożliwiający jego użycie.

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

    [self.view addGestureRecognizer:tap];


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

}
Nirzar Gandhi
źródło
1
  • Ustaw pola tekstowe, które delegat w widoku załadował:

    override func viewDidLoad() 
    {
      super.viewDidLoad()
      self.userText.delegate = self
    }
  • Dodaj tę funkcję:

    func textFieldShouldReturn(userText: UITextField!) -> Bool 
    {
     userText.resignFirstResponder()
     return true;
    }
seggy
źródło