Ł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?


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

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


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.


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.


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


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


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

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.


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


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

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.


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

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

2

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

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];

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

2

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

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

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

}

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.


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.


1

I szybko możemy to zrobić

UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)

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/


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


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

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.


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ć).


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


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 .



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

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];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.