Łatwy sposób na zwolnienie klawiatury?

376

Mam całkiem sporo kontrolek rozrzuconych po wielu komórkach tabeli w mojej tabeli i zastanawiałem się, czy jest łatwiejszy sposób na zwolnienie klawiatury bez konieczności przeglądania wszystkich moich kontrolek i rezygnacji z nich jako pierwszego odpowiadającego. Wydaje mi się, że pytanie brzmi ... Jak uzyskać obecną pierwszą odpowiedź na klawiaturze?

Seventoes
źródło
miłe uzupełnienie tego pytania: stackoverflow.com/questions/1490573/...
ericsoco
Zastrzeżenie do wszystkich poniższych odpowiedzi. Jeśli wykonasz segue zaraz po rezygnacji z KB, KB zostanie osierocony i nie będzie można go odrzucić. Musisz odrzucić KB w metodzie textFieldShouldReturn.
gjpc
26
globalne zwolnienie klawiatury we właściwy sposób:[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Yerk
Znalazłem ten film jako pinkstone.co.uk/... . Może może pomóc innym.
entuzjastyczny

Odpowiedzi:

796

Próbować:

[self.view endEditing:YES];
Kirby
źródło
1
To wydaje się działać (testowane na ios4.1). Chociaż jest dostępny tylko na iOS 3.2 w górę. Nie jestem pewien, czy to rzeczywiście działa, czy jest to po prostu niegwarantowany efekt uboczny wywołania interfejsu API w sposób, który nie jest udokumentowany.
JosephH
3
To działało idealnie dla mnie i na pewno jest lepsze niż niektóre inne odpowiedzi na to pytanie. Dokumenty mówią, że jest dostępny w iOS 2.0 i nowszych.
antsyawn
8
Jak mówi dokumentacja: „Ta metoda sprawdza bieżący widok i jego hierarchię widoków podrzędnych dla pola tekstowego, które jest obecnie pierwszym responderem. Jeśli je znajdzie, prosi to pole tekstowe o rezygnację z funkcji pierwszego respondenta. Jeśli parametr force jest ustawiony dla TAK, pole tekstowe nigdy nie jest pytane; jest zmuszone do rezygnacji. ” - więc to jest IMO poprawna odpowiedź na pierwotne pytanie (przypadek użycia: mam formularz z milionami pól, no cóż - dziesięć ... lub więcej, i muszę zwolnić klawiaturę).
joshis
14
Odpowiedź nie jest zła, ale trochę niepoprawna, tak naprawdę powinna być: [self.view endEditing:YES];ponieważ wartości BOOL są takie same / NIE w Objective-C.
chrisben
24
chrisben: Możesz użyć TAK / NIE, PRAWDA / FAŁSZ, 0/1.
Michael Superczynski
126

Możesz zmusić aktualnie edytowany widok do zrezygnowania ze statusu pierwszego odpowiadającego [view endEditing:YES]. To ukrywa klawiaturę.

W przeciwieństwie do tego -[UIResponder resignFirstResponder], -[UIView endEditing:]przeszukuje podviews, aby znaleźć bieżącego pierwszego respondenta. Możesz więc wysłać go do widoku najwyższego poziomu (np. self.viewA UIViewController), a zrobi to dobrze.

(Ta odpowiedź poprzednio obejmowała kilka innych rozwiązań, które również działały, ale były bardziej skomplikowane niż to konieczne. Usunąłem je, aby uniknąć zamieszania.)

Nicholas Riley
źródło
Spowoduje to jednak jedynie zablokowanie komponentu, aby stał się firstResponder, a nie usunie bieżącego statusu firstResponder z elementu.
Kendall Helmstetter Gelner
To, co miałem na myśli przez przesłonięcie, staje się Pierwszym Odpowiadaczem, aby przechowywać gdzieś pierwszą odpowiedź, aby można było uzyskać do niej dostęp (w tym przypadku zrezygnować) później. Podstawowym problemem jest to, że Cocoa Touch nie zapewnia sposobu, aby zapytać okno lub zobaczyć, kto jest jego pierwszą odpowiedzią.
Nicholas Riley,
+1 Dodanie zostaję Pierwszy raz rozwiązałem problemy, które miałem z dotknięciami innych pól UITextField.
Jason George
3
To jest przestarzałe. [self.view endEditing:YES];Odpowiedź brzmi lepiej.
ftvs
1
To nie jest przestarzałe, ta odpowiedź dokładnie wyjaśnia, jak [UIView endediting:]działa. W jednej z opracowanych przeze mnie aplikacji w UINavigationViewController dodano pole wyszukiwania, jeśli po prostu zadzwonisz [self.view endEditing:YES], jako selfkontroler widoku, to nie zadziała, zamiast tego wywołałem tę metodę bezpośrednio w zakresie widoku, w którym dodano pole wyszukiwania, przykład: [self.mySearchBoxView endEditing:YES].
Jan Cássio
92

Możesz wysłać do aplikacji akcję zerową, zrezygnuje ona z pierwszego odpowiadającego w dowolnym momencie, bez obawy o to, który widok ma obecnie status pierwszego odpowiadającego.

Cel C:

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

Swift 3.0:

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

Brak ukierunkowanych działań jest powszechnych w Mac OS X dla poleceń menu, a oto ich zastosowanie w iOS.

Podróżujący człowiek
źródło
14
Najlepsze rozwiązanie całej strony.
Leo Natan
Absolutnie najlepszy sposób na pozbycie się klawiatury z dowolnego miejsca w aplikacji na iOS.
Ben Sinclair
Nadal działa dla mnie w iOS8. W mojej aplikacji mam menu paska bocznego i czasami „widok środkowy” kontrolera pokazuje klawiaturę. Chcę usunąć klawiaturę, jeśli pojawi się menu paska bocznego. Więc dodałem ten kod do mojego menu paska bocznego Metoda viewWillAppear klasy.
Jenn Eve
1
Nadal działa w systemie iOS 9. Świetny sposób na globalną rezygnację z fokusa pola tekstowego i wyłączenie klawiatury.
bmjohns
I aby kontynuować tę szczególną serię komentarzy ... Nadal działa w iOS 10. :-)
Podróżujący człowiek
56

Szczerze mówiąc, nie przepadam za żadnym z proponowanych tutaj rozwiązań. Znalazłem dobry sposób na użycie TapGestureRecognizer, który moim zdaniem trafia w sedno twojego problemu: kiedy klikniesz na coś poza klawiaturą, zwolnij klawiaturę.

  1. W viewDidLoad zarejestruj się, aby otrzymywać powiadomienia z klawiatury i utwórz UITapGestureRecognizer:

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
  2. Dodaj pokazywanie / ukrywanie klawiatury. Tam dodajesz i usuwasz TapGestureRecognizer do UIView, który powinien zamknąć klawiaturę po stuknięciu. Uwaga: Nie musisz dodawać go do wszystkich widoków podrzędnych lub kontrolek.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
  3. TapGestureRecognizer wywoła twoją funkcję, gdy dostanie stuknięcie i możesz zwolnić klawiaturę w następujący sposób:

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }

Zaletą tego rozwiązania jest to, że filtruje tylko Taps, a nie przeciągnięcia. Jeśli więc przewijasz zawartość nad klawiaturą, przeciągnięcia będą nadal przewijać i pozostawiają klawiaturę wyświetloną. Po usunięciu rozpoznawania gestów po zniknięciu klawiatury przyszłe stuknięcia w widok będą obsługiwane normalnie.

Brett Levine
źródło
Do mojego @implementation dodałem @property (przypisaj) UITapGestureRecognizer * tapRecognizer; i zmodyfikowane self.tapRecognizer = [[Alokacja UITapGestureRecognizer] initWithTarget: self action: @selector (didTapAnywhere :)];
Profesor Todd
Próbuję zrobić podobną rzecz i nie otrzymuję oddzwaniania z beczki. Ciekawe: dlaczego twoja własność „przypisuje”?
TahoeWolverine
Plus jeden, a ponadto powinno to być domyślne zachowanie iOS. Lub przynajmniej dodaj prosty sposób przełączania przycisku odrzucania.
Shaunti Fondrisi,
24

Jest to rozwiązanie, aby klawiatura odejdzie po uderzeniu returnw dowolnym polu tekstowym, dodając kod w jednym miejscu (więc nie trzeba dodawać obsługi dla każdego pola tekstowego):


rozważ ten scenariusz:

Mam viewcontrollerdwa pola tekstowe (nazwa użytkownika i hasło). i viewcontrollerimplementuje UITextFieldDelegateprotokół

robię to w viewDidLoad

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}

a kontroler widoków implementuje opcjonalną metodę jako

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

i niezależnie od tego, w jakim polu tekstowym się znajdujesz, gdy tylko uderzę returnw klawiaturę, zostanie ono odrzucone!

W twoim przypadku to samo działałoby, o ile ustawisz delegata wszystkich pól tekstowych na siebie i zaimplementujesz textFieldShouldReturn

prakash
źródło
Cóż, już mam problem rozwiązany, ale w moim przypadku chciałem sam zdjąć klawiaturę (w kodzie) i nie wiedziałem, który textField ma status pierwszej odpowiedzi.
Seventoes
1
Zdarzają się sytuacje, w których możesz zechcieć zwolnić klawiaturę bez wciśnięcia „return”, na przykład, gdy ma się pojawić menu paska bocznego
Peter Johnson,
Zredagowano, aby wyjaśnić, że ta odpowiedź jest ważna tylko w sytuacjach, w których naciśnięcie „return” jest akceptowalnym rozwiązaniem. [W moim przypadku chciałem również zamknąć klawiaturę, gdy użytkownik stuknie poza edytowanym polem; ta odpowiedź nie pomaga w tym.]
ToolmakerSteve
14

Lepszym podejściem jest posiadanie czegoś „kradnącego” status pierwszego reagującego.

Ponieważ UIApplication jest podklasą UIResponder, możesz spróbować:

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]

W przeciwnym razie utwórz nowy UITextField z ramką o zerowym rozmiarze, dodaj go gdzieś do widoku i zrób coś podobnego (po czym nastąpi rezygnacja).

Kendall Helmstetter Gelner
źródło
1
Sztuczka UIApplication nie działa (ulega awarii, przynajmniej na symulatorze), ale nie potrzebujesz pola UITextField o zerowej wielkości - po prostu wybierz dowolne losowe pole i zrób to z nim. NSFesponder staje sięFirstResponder jest metodą służącą tylko do powiadamiania, ale UIResponder nie jest (tak naprawdę projekt jest gorszy).
Nicholas Riley,
1
Aha, dzięki! Zawiesza się nazywając go w UIApplication, ale UITextField o zerowym rozmiarze działa świetnie i nie muszę pobierać żadnego z moich poprzednich pól.
Seventoes
Dlaczego ktoś miałby to robić, jeśli istnieje oficjalna, doskonale dobra i udokumentowana metoda?
Maciej Swic,
2
Nie zobaczyliby najbardziej pozytywnej odpowiedzi na lepsze rozwiązanie. Po prostu nie było to wtedy dobrze znane (moja odpowiedź pochodziła z 2009 r., Druga odpowiedź nadeszła ponad rok później w 2010 r.). ale zostawiam to dla potomności.
Kendall Helmstetter Gelner,
8

Ukryj to w klasie użytkowej.

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}
Lorean
źródło
1
tego szukałem!
aslisabanci,
Idealnie, z tym wyjątkiem, że wcale nie potrzebujesz metody globalResignFirstResponderRec, po prostu wywołaj zamiast tego [view endEditing: YES]. Robi to samo.
n13
Tak! Ostateczne rozwiązanie! Próbowałem na wiele sposobów, tylko ten działa dla mnie! Dziękuję Ci bardzo!
douyw
6

@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:

Absolutnie genialny!

Dziękuję Ci.

Biorąc pod uwagę porady i porady innych osób w tym wątku, oto co zrobiłem:

Jak to wygląda po użyciu:

[[self appDelegate] dismissKeyboard]; (uwaga: dodałem appDelegate jako dodatek do NSObject, dzięki czemu mogę używać go w dowolnym miejscu)

Jak to wygląda pod maską:

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}

EDYTOWAĆ

Poprawka do mojej dołączonej odpowiedzi tempTextField.enabled = NO;. Wyłączenie pole tekstowe będzie zapobiegać UIKeyboardWillShowNotificationi UIKeyboardWillHideNotificationpowiadomienia są wysyłane z klawiatury należy polegać na tych powiadomień całej aplikacji.

Jeremy
źródło
nie wiem, czy to działa, ale wydaje się to mądry i łatwy sposób.
demon
5

Szybka wskazówka, jak zamknąć klawiaturę w systemie iOS, gdy użytkownik dotknie dowolnego miejsca na ekranie poza polem UITextField lub klawiaturą. Biorąc pod uwagę, ile nieruchomości może zająć klawiatura iOS, sensowny jest, aby użytkownicy mogli łatwo i łatwo zdjąć klawiaturę.

Oto link

Armen
źródło
Świetny! dodanie do AppDelegate sprawia, że ​​działa dla WSZYSTKICH powiązanych widoków.
Jiulong Zhao,
5

Wiele zbyt skomplikowanych odpowiedzi tutaj, być może dlatego, że nie jest to łatwe do znalezienia w dokumentacji iOS. JosephH miał to tuż powyżej:

[[view window] endEditing:YES];
Ian Wilkinson
źródło
4

Nawet prostsze niż odpowiedź Meagara

przepisać touchesBegan:withEvent:

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

Stanie się tak, dismiss the keyboardgdy dotkniesz dowolnego miejsca w background.

użytkownik3032314
źródło
3

Oto, czego używam w moim kodzie. To działa jak urok!

W yourviewcontroller.h dodaj:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Teraz w pliku .m dodaj to do funkcji ViewDidLoad:

- (void)viewDidLoad {
    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Dodaj również tę funkcję do pliku .m:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
Weź
źródło
Dzięki! Ale powinieneś zmienić nazwę funkcji na „didTapAnywhere” lub rozpoznawanie gestów na „handleSingleTap” ;-)
Matthijs
2

W pliku nagłówkowym kontrolera widoku dodaj <UITextFieldDelegate>definicję interfejsu kontrolera, aby był zgodny z protokołem delegowania UITextField ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... W pliku implementacyjnym kontrolera (.m) dodaj następującą metodę lub kod, jeśli masz już metodę viewDidLoad ...

- (void)viewDidLoad
{
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTextBox.delegate = self;
}

... Następnie połącz yourTextBox z rzeczywistym polem tekstowym

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    if (theTextField == yourTextBox) {
        [theTextField resignFirstResponder];
    }
    return YES;
}
użytkownik1270998
źródło
2

Powinieneś wysłać endEditing:do działającego okna będącego podklasąUIView

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];
malex
źródło
Założę się, że miałeś na myśli TAK)
Matrosov Alexander
2

Najlepszym sposobem na odrzucenie klawiatury z UITableView i UIScrollView są:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag
Manish Methani
źródło
2

W swift 3 możesz wykonać następujące czynności

UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
KeithC
źródło
1

Wydaje mi się, że odpowiedź Jeremy'ego nie do końca działała, ponieważ miałem widok nawigacji w widoku kart z modalnym oknem dialogowym na górze. Korzystam teraz z poniższych i to działa dla mnie, ale twój przebieg może się różnić.

 // dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord

// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;

// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard {    // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];

    UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called.  Probably is a way to determine this progragrammatically)
    UIViewController *uivc;
    if (myRootViewController.navigationController != nil) { // for when there is a nav stack
        uivc = myRootViewController.navigationController;
    } else {
        uivc = myRootViewController;
    }

    if (uivc.modalViewController != nil) { // for when there is something modal
        uivc = uivc.modalViewController;
    } 

    [uivc.view  addSubview:tempTextField];

    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
    [tempTextField release];

}
JJ Rohrer
źródło
Hmm - dlaczego głosowanie w dół? Konkretne braki w świecie rzeczywistym rozwiązałem w innej odpowiedzi za pomocą przetestowanego kodu. Rozumiem brak podwyżek głosów, ale głosowanie na negatywne terytorium jest prawdziwym zniechęceniem. Nadal mam nadzieję, że powyższa odpowiedź pomoże komuś innemu.
JJ Rohrer
1

Może być również konieczne zastąpienie UIViewController wyłączaAutomaticKeyboardDismissal, aby w niektórych przypadkach działało. Może to być konieczne w UINavigationController, jeśli go masz.

Craig Miller
źródło
1

Podklasuj pola tekstowe ... a także widoki tekstu

W podklasie umieść ten kod ..

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

W polu tekstowym delegaci (podobnie w przypadku elementów tekstowych)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

Wszystko gotowe. Teraz wystarczy wysłać powiadomienie z dowolnego miejsca w kodzie. Zrezygnuje z dowolnej klawiatury.

mmmanishs
źródło
1

I szybko możemy to zrobić

UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)
Eike
źródło
Nie rozumiem, jak działa pierwszy odpowiadający .. gdzie to umieścić? w moim widoku kontroler lub delegat?
Shayan C,
Nie ma znaczenia Możesz umieścić go tam, gdzie chcesz. tj. akcja przycisku
Eike,
1

Aby zamknąć klawiaturę po jej wyskoczeniu, są 2 przypadki ,

  1. gdy UITextField znajduje się w UIScrollView

  2. gdy UITextField znajduje się poza UIScrollView

2. gdy pole UITextField znajduje się poza UIScrollView, zastąp metodę w podklasie UIViewController

musisz także dodać delegata dla wszystkich UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. W widoku przewijania Stuknięcie na zewnątrz nie uruchomi żadnego zdarzenia , więc w takim przypadku użyj narzędzia Rozpoznawanie gestów , przeciągnij i upuść UITapGesture dla widoku przewijania i utwórz dla niego IBAction .

aby utworzyć IBAction, naciśnij ctrl + kliknij UITapGesture i przeciągnij go do pliku .h programu viewcontroller.

Tutaj nazwałem tappedEvent jako moją nazwę działania

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

powyższe informacje pochodzą z następującego linku, proszę o więcej informacji lub skontaktuj się ze mną, jeśli nie rozumiesz powyższych danych.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


źródło
0

Nienawidzę tego, że nie ma „globalnego” sposobu programowego wyłączenia klawiatury bez korzystania z prywatnych wywołań API. Często muszę programowo wyłączać klawiaturę, nie wiedząc, który obiekt jest pierwszą odpowiedzią. Zwróciłem się do sprawdzenia selfużywania środowiska uruchomieniowego Objective-C API, wyliczając wszystkie jego właściwości, wyciągając te, które są typowe UITextField, i wysyłając im resignFirstResponderwiadomość.

To nie powinno być takie trudne ...

CIFilter
źródło
0

To nie jest ładne, ale sposób, w jaki rezygnuję z pierwszego odpowiedzi, gdy nie wiem, co to jest odpowiadający:

Utwórz pole UITextField w IB lub programowo. Ukryj to. Połącz go ze swoim kodem, jeśli wykonałeś go w IB. Następnie, gdy chcesz zwolnić klawiaturę, przełączasz odpowiadającego na niewidoczne pole tekstowe i natychmiast go rezygnujesz:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];
Cannyboy
źródło
0

Możesz rekurencyjnie iterować przez widoki podrzędne, przechowywać tablicę wszystkich pól UITextField, a następnie przeglądać je i rezygnować z nich wszystkich.

Niezbyt dobre rozwiązanie, zwłaszcza jeśli masz wiele podstron, ale w przypadku prostych aplikacji powinno to załatwić sprawę.

Rozwiązałem to w znacznie bardziej skomplikowany, ale o wiele bardziej wydajny sposób, ale używając singletona / managera dla silnika animacji mojej aplikacji i za każdym razem, gdy pole tekstowe stawało się odpowiedzią, przypisywałem je do statycznego, który zamiecione (zrezygnowane) na podstawie niektórych innych wydarzeń ... to prawie niemożliwe dla mnie wyjaśnić w akapicie.

Bądź kreatywny, zajęło mi tylko 10 minut, aby przemyśleć to w mojej aplikacji po znalezieniu tego pytania.

M. Ryan
źródło
Rozwiązany kilka miesięcy temu;) Skończyło się na zapisaniu aktywnego pola i skupieniu się na nim.
Seventoes
0

Nieco bardziej niezawodna metoda, której ostatnio potrzebowałem:

- (void) dismissKeyboard {
    NSArray *windows = [UIApplication sharedApplication].windows;

    for(UIWindow *window in windows) [window endEditing:true];

    //  Or if you're only working with one UIWindow:

    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Znalazłem kilka innych „globalnych” metod nie działa (na przykład, UIWebViewi WKWebViewnie chciał zrezygnować).

mattsven
źródło
0

Dodaj do widoku rozpoznawanie gestów tap i zdefiniuj ibaction

Twój plik .m będzie podobny

    - (IBAction)hideKeyboardGesture:(id)sender {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in windows) [window endEditing:true];
    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

To zadziałało dla mnie

Murat KAYA
źródło
0

Tak, endEditing jest najlepszą opcją. I od iOW 7.0, UIScrollViewma fajną funkcję, aby zwolnić klawiaturę podczas interakcji z widokiem przewijania. Aby to osiągnąć, możesz ustawić keyboardDismissModewłaściwość UIScrollView.

Ustaw tryb odrzucania klawiatury jako:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

Ma kilka innych typów. Spójrz na ten dokument Apple .

Shanmugaraja G.
źródło
0

W krótkim:

self.view.endEditing(true)
YannSteph
źródło
0

najłatwiejszym sposobem jest wywołanie metody

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    if(![txtfld resignFirstResponder])
    {
        [txtfld resignFirstResponder];
    }
    else
    {

    }
    [super touchesBegan:touches withEvent:event];
}
bharath gangupalli
źródło
Nie potrzebujesz tam „if”, resignFirstResponder i tak to zrobi. Może miałeś na myśli - (BOOL) canResignFirstResponder?
Seventoes
0

Musisz użyć jednej z tych metod,

[self.view endEditing:YES];

lub

[self.textField resignFirstResponder];
Vaibhav Shiledar
źródło