Mam UITableView
ze UITextField
s jak komórki. Chciałbym odrzucić klawiaturę po UITableView
dotknięciu tła . Próbuję to zrobić, tworząc UIButton
rozmiar UITableView
i umieszczając go za UITableView
. Jedynym problemem jest toUIButton
przechwytuje wszystkie dotknięcia, nawet gdy dotyk jest w UITableView. Co ja robię źle?
Dzięki!
ios
uitableview
uikeyboard
Hua-Ying
źródło
źródło
Odpowiedzi:
Można to łatwo zrobić, tworząc UITapGestureRecognizer obiekt (domyślnie spowoduje to wykrycie „gestu” po jednym dotknięciu, więc dalsze dostosowywanie nie jest wymagane), określając cel / akcję, gdy gest jest uruchamiany, a następnie dołączając obiekt rozpoznawania gestów do widoku tabeli.
Np. Być może w Twojej
viewDidLoad
metodzie:A
hideKeyboard
metoda może wyglądać następująco:Zwróć uwagę, że gest nie jest wykonywany podczas dotykania wnętrza
UITextField
obiektu. Jest uruchamiany wUITableView
tle, widoku stopki, widoku nagłówka iUILabels
wewnątrz komórek itp.źródło
gestureRecognizer.cancelsTouchesInView = NO;
hideKeyboard
metody, zamiast komunikować się bezpośrednio z polami tekstowymi, możesz to zrobić[self.view endEditing:NO];
. Z dokumentów Apple: „ Ta metoda sprawdza bieżący widok i jego hierarchię podglądy dla pola tekstowego, które jest obecnie pierwszą osobą odpowiadającą. Jeśli znajdzie, prosi to pole tekstowe o rezygnację jako pierwsza osoba odpowiadająca. Jeśli parametr siły jest ustawiony na TAK, pole tekstowe nigdy nie jestRozwiązanie UITapGestureRecognizer działa z zaznaczaniem komórek tabeli, jeśli ustawisz:
źródło
shouldReceiveTouch
Oto najlepszy sposób, aby to zrobić. Po prostu zrób to
lub
źródło
Możesz to również zrobić w Storyboard:
źródło
Podobnie
UITableView
jak podklasaUIScrollView
, implementacja jednej metody delegata poniżej zapewnia niezwykle łatwe i szybkie rozwiązanie. Nie ma potrzeby nawet się angażować,resignFirstResponder
ponieważ przeglądanie hierarchii przeprowadza introspekcję i znajduje obecnego respondenta i prosi go o rezygnację ze statusu respondenta.I pamiętaj, aby dodać
UIScrollViewDelegate
do pliku nagłówkowego.źródło
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
Po pierwsze, posłuchaj
scrollViewWillBeginDragging
w swoimUIViewController
, dodającUIScrollViewDelegate
:W pliku .h:
W pliku .m:
Następnie posłuchaj innych interakcji:
Następnie zastosuj
dismissKeyboard
:A jeśli, tak jak ja, chcesz odrzucić klawiaturę dla UITextField wewnątrz niestandardowej komórki tabeli:
Mam nadzieję, że pomoże to każdemu w wyszukiwaniu!
źródło
źródło
Oto szybka wersja dla przyjemności z kodowania:
Dodaje rozpoznawanie gestów stuknięcia, a następnie odrzuca klawiaturę. Nie jest wymagane gniazdko dla TextField!
źródło
Dostępna jest wersja Swift 3 bez blokowania dotknięć komórek.
W
viewDidLoad()
metodzie:I
hideKeyboard
wygląda tak:źródło
Zrobiłem to tak:
Utwórz metodę w swoim TableViewController, aby dezaktywować pierwszy responder (który byłby wtedy Twoim TextBox)
W
tableView:didSelectRowAtIndexPath:
wywołaniu poprzednia metoda:źródło
didSelectRowAtIndexPath
się nie uruchamia, jeśli dotkniesz samego TableView.Miałem
UITableViewController
i implementacjatouchesBegan:withEvent:
nie zadziałała.Oto, co zadziałało:
Szybki:
Cel C:
źródło
Następnie upewnij się, że w pliku Nib ustawiłeś typ swojego UITableView na DismissableUITableView ..... może mógłbym wymyślić lepszą nazwę dla tej klasy, ale o co chodzi.
źródło
Jeśli kierujesz reklamy na iOS7, możesz użyć jednej z następujących opcji:
Pierwsza z nich będzie animować klawiaturę poza ekranem, gdy widok tabeli jest przewijany, a druga ukryje klawiaturę, podobnie jak standardowa aplikacja Wiadomości.
Zauważ, że są one z
UIScrollView
, któreUITableView
dziedziczy z.źródło
Spróbuj tego:
źródło
UITableView jest podklasą UIScrollView.
Sposób, w jaki to zrobiłem, polegał na nasłuchiwaniu zdarzenia przewijania przez użytkownika, a następnie rezygnacji z FirstResponder. Oto metoda UIScrollViewDelegate do zaimplementowania w kodzie;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
Przy podejściu do tego rodzaju problemów stwierdziłem, że najlepszym sposobem jest zbadanie protokołów delegatów dla każdego obiektu i klas nadrzędnych (w tym przypadku UITableViewDelegate, UIScrollViewDelegate. Liczba zdarzeń wywoływanych przez obiekty NS jest dość duża i wyczerpująca. łatwiejsze jest także implementowanie protokołu, a następnie tworzenie podklas.
źródło
Miałem ten sam problem i oto moje rozwiązanie, u mnie działa idealnie:
W zaimplementowanym kontrolerze widoku lub widoku
<UITextFieldDelegate>
(W moim przypadku mam zwyczaj
UITableViewCell
nazwę TextFieldCell),Zadeklaruj
UITapGestureRecognizer
jako właściwość:I zainicjuj go w swoim widoku / kontrolerze:
W
- (void)textFieldDidBeginEditing:(UITextField *)textField
metodzie użyj,superView
aby przejść do swojego tableView i wywołajaddGestureRecognizer
:Po
- (void)textFieldDidEndEditing:(UITextField *)textField
prostu usuń aparat rozpoznawania gestów:Mam nadzieję, że to pomoże.
źródło
Chciałem, aby moja komórka otwierała klawiaturę po wybraniu dowolnej części komórki i zamykała ją, jeśli klikniesz w dowolnym miejscu poza komórką. Aby otworzyć klawiaturę:
(UWAGA: podklasowałem komórkę, ale możesz to łatwo osiągnąć w
tableView:didSelectRowAtIndexPath:
metodzie delegataUITableView
)Oznaczało to, że w przypadku najlepszych rozwiązań, jeśli dwukrotnie klikniesz komórkę, klawiatura będzie się trząść, ponieważ najpierw mechanizm rozpoznawania gestów próbował zamknąć klawiaturę, a po drugie komórka została ponownie wybrana i spróbowała otworzyć klawiaturę.
Rozwiązaniem jest sprawdzenie, czy kliknięcie nastąpiło w aktualnie wybranej komórce:
źródło
Znalazłem rozwiązanie, które działa świetnie.
Jest potrzebne do użycia UIGestureRecognizerDelegate i metody - GestRecognizer: shouldReceiveTouch: .
Dodaj aparat rozpoznawania gestów do TableView w następujący sposób:
Następnie zaimplementuj metodę delegata shouldReceiveTouch , aby odrzucić dotknięcia wykonywane w klasie UITableViewCell. Metoda hideKeyboard zostanie wywołana tylko wtedy, gdy dotknięcie zostało wykonane poza klasą UITableViewCell.
źródło
UITableView
ma przydatnąbackgroundView
właściwość, dzięki której osiągnąłem to zachowanie bez mieszania się przy wyborze komórek, jak pokazano poniżej w Swift:źródło
Szukałem rozwiązania i nie znalazłem nic, co pasowałoby do mojego kodu, więc zrobiłem to tak:
http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap
Jest to w zasadzie kombinacja wyżej wymienionych podejść, ale nie wymaga tworzenia podklas ani tworzenia przycisków w tle.
źródło
Po prostu użycie UITapGestureRecognizer i
cancelsTouchesInView = NO
oznacza, że dotknięcie komórek i UITextViews również wyzwalają ukrywanie. To jest złe, jeśli masz wiele UITextViews i stukasz w następny. Klawiatura zacznie się ukrywać, a następnie następny textView stanie się pierwszym Responderem, a klawiatura znów stanie się widoczna. Aby tego uniknąć, sprawdź lokalizację dotknięcia i ukryj klawiaturę tylko wtedy, gdy dotknięcie nie znajduje się w komórce:Aby
scrollViewWillBeginDragging:
funkcja tableView została wyzwolona,scrollEnabled
musi mieć wartośćYES
źródło
Dlaczego chcesz utworzyć tabelę pełną pól tekstowych? Powinieneś używać widoku szczegółowego dla każdego wiersza zawierającego pola tekstowe. Kiedy wysyłasz swój szczegółowy widok, upewnij się, że wywołujesz „[myTextField staje sięFirstResponder]”, aby użytkownik mógł rozpocząć edycję jednym kliknięciem od listy tabel.
źródło
Jeśli chcesz podklasować (ugh!) Swój widok tabeli, może zadziałać coś takiego :
źródło
Jeśli chcesz odrzucić klawiaturę podczas naciskania klawisza Return, możesz po prostu dodać następujący kod w textField powinien zwrócić metodę, tj .:
Niektóre pola tekstowe mogą mieć widok selektora lub inny jako widok podrzędny, więc w takim przypadku powyższa metoda nie działa, więc w takim przypadku musimy skorzystać z klasy UITapGestureRecognizer, tj. Dodać następujący fragment kodu do metody viewDidLoad, tj .:
Teraz po prostu dodaj respondera rezygnującego do metody selektora, tj .:
Mam nadzieję, że to pomoże, dzięki :)
źródło
Wiele ciekawych odpowiedzi. Chciałbym skompilować różne podejścia do rozwiązania, które moim zdaniem najlepiej pasuje do scenariusza UITableView (jest to ten, którego zwykle używam): Zwykle chcemy ukryć klawiaturę w dwóch scenariuszach: po dotknięciu poza elementami interfejsu tekstowego, lub podczas przewijania w dół / w górę UITableView. Pierwszy scenariusz możemy łatwo dodać za pomocą TapGestureRecognizer, a drugi za pomocą metody UIScrollViewDelegate scrollViewWillBeginDragging:. Pierwsza sprawa, sposób na ukrycie klawiatury:
Ta metoda rezygnuje z dowolnego interfejsu użytkownika textField z podglądów podrzędnych w hierarchii widoku UITableView, więc jest bardziej praktyczna niż rezygnacja z każdego pojedynczego elementu niezależnie.
Następnie zajmiemy się zwolnieniem za pomocą zewnętrznego gestu Tap, za pomocą:
Ustawienie opcji tapGestureRecognizer.cancelsTouchesInView na NO ma na celu uniknięcie zastąpienia przez gestRecognizer normalnych wewnętrznych działań UITableView (na przykład nie kolidować z zaznaczaniem komórki).
Wreszcie, aby obsłużyć ukrywanie klawiatury przy przewijaniu w górę / w dół UITableView, musimy zaimplementować protokół UIScrollViewDelegate scrollViewWillBeginDragging: method, jako:
plik .h
plik .m
Mam nadzieję, że to pomoże! =)
źródło
Oto, jak w końcu stworzyłem prace. Połączyłem sugestie i kody z różnych odpowiedzi. Funkcje: odrzucanie klawiatury, przesuwanie pól tekstowych nad klawiaturą podczas edycji i ustawianie typu powrotu klawiatury „Dalej” i „Gotowe”. ZAMIEŃ „...” na więcej pól
źródło
Odpowiedź @ mixca jest bardzo przydatna, ale co, jeśli mam coś innego niż UITextField. Myślę, że najlepszym sposobem na to jest przeszukanie wszystkich podwidoków widoku głównego z funkcją rekurencyjną, sprawdź poniższy przykład
a także możesz umieścić tę metodę w swojej klasie narzędziowej i użyć gestu dotknięcia, takiego jak odpowiedź @ mixca.
źródło
Swift 4 / 4,2 / 5
Możesz także zamknąć klawiaturę po dotknięciu komórki - zanim zrobisz cokolwiek innego.
źródło
tableView.keyboardDismissMode = .onDrag // .interactive
źródło