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?
objective-c
cocoa-touch
sdk
Seventoes
źródło
źródło
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Odpowiedzi:
Próbować:
źródło
[self.view endEditing:YES];
ponieważ wartości BOOL są takie same / NIE w Objective-C.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.view
AUIViewController
), 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.)
źródło
[self.view endEditing:YES];
Odpowiedź brzmi lepiej.[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]
, jakoself
kontroler 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]
.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:
Swift 3.0:
Brak ukierunkowanych działań jest powszechnych w Mac OS X dla poleceń menu, a oto ich zastosowanie w iOS.
źródło
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ę.
W viewDidLoad zarejestruj się, aby otrzymywać powiadomienia z klawiatury i utwórz UITapGestureRecognizer:
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.
TapGestureRecognizer wywoła twoją funkcję, gdy dostanie stuknięcie i możesz zwolnić klawiaturę w następujący sposób:
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.
źródło
Jest to rozwiązanie, aby klawiatura odejdzie po uderzeniu
return
w 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
viewcontroller
dwa pola tekstowe (nazwa użytkownika i hasło). iviewcontroller
implementujeUITextFieldDelegate
protokółrobię to w viewDidLoad
a kontroler widoków implementuje opcjonalną metodę jako
i niezależnie od tego, w jakim polu tekstowym się znajdujesz, gdy tylko uderzę
return
w 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
źródło
Lepszym podejściem jest posiadanie czegoś „kradnącego” status pierwszego reagującego.
Ponieważ UIApplication jest podklasą UIResponder, możesz spróbować:
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).
źródło
Ukryj to w klasie użytkowej.
źródło
@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ą:
EDYTOWAĆ
Poprawka do mojej dołączonej odpowiedzi
tempTextField.enabled = NO;
. Wyłączenie pole tekstowe będzie zapobiegaćUIKeyboardWillShowNotification
iUIKeyboardWillHideNotification
powiadomienia są wysyłane z klawiatury należy polegać na tych powiadomień całej aplikacji.źródło
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
źródło
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:
źródło
Nawet prostsze niż odpowiedź Meagara
przepisać
touchesBegan:withEvent:
Stanie się tak,
dismiss the keyboard
gdy dotkniesz dowolnego miejsca wbackground
.źródło
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:
Dodaj również tę funkcję do pliku .m:
źródło
W pliku nagłówkowym kontrolera widoku dodaj
<UITextFieldDelegate>
definicję interfejsu kontrolera, aby był zgodny z protokołem delegowania UITextField ...... W pliku implementacyjnym kontrolera (.m) dodaj następującą metodę lub kod, jeśli masz już metodę viewDidLoad ...
... Następnie połącz yourTextBox z rzeczywistym polem tekstowym
źródło
Powinieneś wysłać
endEditing:
do działającego okna będącego podklasąUIView
źródło
Najlepszym sposobem na odrzucenie klawiatury z UITableView i UIScrollView są:
źródło
W swift 3 możesz wykonać następujące czynności
źródło
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ć.
źródło
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.
źródło
Podklasuj pola tekstowe ... a także widoki tekstu
W podklasie umieść ten kod ..
W polu tekstowym delegaci (podobnie w przypadku elementów tekstowych)
Wszystko gotowe. Teraz wystarczy wysłać powiadomienie z dowolnego miejsca w kodzie. Zrezygnuje z dowolnej klawiatury.
źródło
I szybko możemy to zrobić
źródło
Aby zamknąć klawiaturę po jej wyskoczeniu, są 2 przypadki ,
gdy UITextField znajduje się w UIScrollView
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
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
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
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
self
używania środowiska uruchomieniowego Objective-C API, wyliczając wszystkie jego właściwości, wyciągając te, które są typoweUITextField
, i wysyłając imresignFirstResponder
wiadomość.To nie powinno być takie trudne ...
źródło
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:
źródło
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.
źródło
Nieco bardziej niezawodna metoda, której ostatnio potrzebowałem:
Znalazłem kilka innych „globalnych” metod nie działa (na przykład,
UIWebView
iWKWebView
nie chciał zrezygnować).źródło
Dodaj do widoku rozpoznawanie gestów tap i zdefiniuj ibaction
Twój plik .m będzie podobny
To zadziałało dla mnie
źródło
Tak, endEditing jest najlepszą opcją. I od iOW 7.0,
UIScrollView
ma fajną funkcję, aby zwolnić klawiaturę podczas interakcji z widokiem przewijania. Aby to osiągnąć, możesz ustawićkeyboardDismissMode
właściwośćUIScrollView
.Ustaw tryb odrzucania klawiatury jako:
Ma kilka innych typów. Spójrz na ten dokument Apple .
źródło
W krótkim:
źródło
najłatwiejszym sposobem jest wywołanie metody
źródło
Musisz użyć jednej z tych metod,
lub
źródło