Napisałem własną funkcję przewijania pól tekstowych w górę, gdy pojawia się klawiatura. Aby zamknąć klawiaturę, dotykając pola tekstowego, stworzyłem taki, UITapGestureRecognizer
który dba o rezygnację z pierwszej odpowiedzi na polu tekstowym po stuknięciu.
Teraz utworzyłem również autouzupełnianie dla UITableView
pola tekstowego, które tworzy pole tuż pod polem tekstowym i wypełnia je elementami, gdy użytkownik wprowadza tekst.
Jednak po wybraniu jednego z wpisów w tabeli autouzupełniania didSelectRowAtIndexPath
nie zostanie wywołany. Zamiast tego wydaje się, że rozpoznawany jest gest rozpoznawania gestów i po prostu rezygnuje z pierwszej odpowiedzi.
Domyślam się, że jest jakiś sposób, aby powiedzieć narzędziu rozpoznającemu gest gestu, aby dalej przekazywał komunikat o dotknięciu do UITableView
, ale nie mogę zrozumieć, co to jest. Każda forma pomocy jest mile widziana.
Odpowiedzi:
Ok, w końcu znalazłem to po przeszukaniu dokumentacji rozpoznawania gestów.
Rozwiązaniem było wdrożenie
UIGestureRecognizerDelegate
i dodanie następujących elementów:To załatwiło sprawę. Mam nadzieję, że pomoże to również innym.
źródło
return ![touch.view isKindOfClass:[UITableViewCell class]];
![touch.view isEqual: self.tableView] &&
przed,[touch.view isDescendantOfView: self.tableView]
aby wykluczyćtableView
sam (ponieważisDescendantOfView:
zwraca również,YES
jeśli argument-widok jest samym widokiem-odbiorcy). Mam nadzieję, że pomaga innym ludziom, którzy chcą tego samego rezultatu.Najprostszym sposobem rozwiązania tego problemu jest:
Pozwala to
UIGestureRecognizer
rozpoznać stuknięcie, a także przekazać dotyk następnemu respondentowi. Niezamierzoną konsekwencją tej metody jest to, że maszUITableViewCell
ekran, który popycha inny kontroler widoku. Jeśli użytkownik stuknie wiersz, aby zamknąć klawiaturę, zarówno klawiatura, jak i push zostaną rozpoznane. Wątpię, aby to było to, co zamierzasz, ale ta metoda jest odpowiednia w wielu sytuacjach.Ponadto, rozwijając odpowiedź Roberta, jeśli masz wskaźnik do widoku tabeli, o którym mowa, możesz bezpośrednio porównać jego klasę zamiast konwertować na ciąg znaków i mam nadzieję, że Apple nie zmieni nazewnictwa:
Pamiętaj, że musisz również zadeklarować,
UIGestureRecognizer
aby mieć delegata z tym kodem.źródło
isDescendantOfView
zamiast sprawdzania, czy wartośćclass
jest równa, ponieważ możesz stuknąć w widok podrzędny. Zależy od tego, czego potrzebujesz.Ustaw
cancelsTouchesInView
w rozpoznawaniu wartość false. W przeciwnym razie sam „zużywa” dotyk i nie przekazuje go do widoku tabeli. Dlatego nigdy nie odbywa się selekcja.na przykład w
swift
źródło
I dla Swift (na podstawie odpowiedzi @Jason):
źródło
Mogę mieć lepsze rozwiązanie, aby dodać gest stuknięcia w widoku tabeli, ale jednocześnie umożliwiając wybór komórki:
Po prostu szukam komórki w punkcie ekranu, w którym użytkownik stuka. Jeśli nie znaleziono ścieżki indeksu, pozwalam gestowi na dotknięcie, w przeciwnym razie go anuluję. Dla mnie działa świetnie.
źródło
Myślę, że nie ma potrzeby zapisu bloków kodów po prostu zestaw
cancelsTouchesInView
dofalse
dla obiektu gest, domyślnie jest totrue
i po prostu trzeba go ustawićfalse
. Jeśli używaszUITapGesture
obiektu w kodzie, a także używaszUIScrollView
(widok tabeli, widok kolekcji), ustaw tę właściwośćfalse
źródło
Podobnym rozwiązaniem jest wdrożenie
gestureRecognizer:shouldReceiveTouch:
za pomocą klasy widoku w celu ustalenia, jakie działanie należy podjąć. Zaletą tego podejścia jest nie maskowanie zaczepów w regionie bezpośrednio otaczającym tabelę (widoki tych obszarów nadal pochodzą z instancji UITableView, ale nie reprezentują komórek).Ma to również tę zaletę, że działa z wieloma tabelami w jednym widoku (bez dodawania dodatkowego kodu).
Zastrzeżenie: zakłada się, że Apple nie zmieni nazwy klasy.
źródło
return ![[touch.view.superview class] isSubclassOfClass:[UITableViewCell class]];
W przypadku Swift 4.2 rozwiązaniem było wdrożenie
UIGestureRecognizerDelegate
i dodanie następujących elementów:po kliknięciu widoku tabeli ta metoda delegowania zwraca wartość false, a
didSelectRowAtIndexPath
metoda widoku tabeli działa poprawnie.źródło
Miałem inną sytuację, w której chciałem, aby funkcja gestu dotykowego była wywoływana tylko wtedy, gdy użytkownik stuknął poza widok tabeli. Jeśli użytkownik dotknął wewnątrz widoku tabeli, nie należy wywoływać funkcji gestu dotykowego. Dodatkowo, jeśli wywoływana jest funkcja gestu dotykowego, powinna ona nadal przekazywać zdarzenie dotykowe do widoku, który został kliknięty, zamiast go zużywać.
Wynikowy kod jest kombinacją odpowiedzi Abdulrahmana Masouda i odpowiedzi Nikolaja Nielsena.
A w
MyViewController
klasie, w klasieUITableView
, w którejonViewDidLoad()
, zadzwoniłemaddGestureRecognizer()
:źródło
Wystarczy ustawić
cancels touches in view
, abyfalse
na każdym geście poniżej(table/collection)View
:- Konstruktor interfejsów
- Kod
źródło
Chociaż jest późno i wiele osób uważa, że powyższe sugestie działają dobrze, nie mogłem zmusić metod Jasona lub TMilligan do działania.
Mam Statyczny tableView z wieloma komórkami zawierającymi pola tekstowe, które odbierają dane liczbowe za pomocą tylko klawiatury numerycznej. To było dla mnie idealne:
Upewnij się, że zaimplementowałeś to
<UIGestureRecognizerDelegate>
w pliku .h.Ten wiersz
![touch.view isKindOfClass:[UITableViewCell class]]
sprawdza, czy podsłuchiwano tableViewCell, i usuwa aktywną klawiaturę.źródło
Prostym rozwiązaniem jest użycie instancji UIControl w UITableViewCell, aby uzyskać poprawki. Możesz dodać dowolne widoki za pomocą userInteractionEnables == NO do UIControl, aby uzyskać tapy.
źródło
Oto moje rozwiązanie, które łączy bezpośrednio moduł rozpoznawania rozpoznawania z tym, czy klawiatura się wyświetla.
W funkcji rozpoznawania gestów dotknij deleguj:
Oraz
PFXKeyboardStateListener.h
:Oraz
PFXKeyboardStateListener.m
:Może chcesz zaktualizować wzór singletonu dla nasłuchującego na klawiaturze, jeszcze go nie dostałem. Mam nadzieję, że to zadziała dla wszystkich innych, a także dla mnie. ^^
źródło
Zaimplementuj tę metodę dla delegata UIGestureRecognizer:
źródło
Szybko możesz użyć tego w środku
źródło
Moja sprawa była inna, w tym uisearchbar i uitableview na self.view. Chciałem zamknąć klawiaturę uisearchbar, dotykając widoku.
W przypadku metod delegowania UISearchBar:
Gdy użytkownik dotknie self.view:
źródło
Swift 5, maj 2020 r.
Mam textField i tableView, które stają się widoczne po wprowadzeniu tekstu.
Stan początkowy Więc chcę 2 różne zdarzenia, kiedy dotknę tableViewCell lub coś innego.
Wyświetlane są klawiatura i widok tabeli
Najpierw dodajemy tapGestureRecognizer.
Następnie dodajemy następujące sprawdzenie do UIGestureRecognizerDelegate:
}
Jeśli najpierw chcę ukryć klawiaturę, tableView pozostaje widoczny i reaguje na dotyk.
wprowadź opis zdjęcia tutaj
źródło
To jest moje rozwiązanie oparte na powyższych odpowiedziach ... To zadziałało dla mnie ...
źródło
PROBLEM: W moim przypadku problemem było to, że pierwotnie umieściłem przycisk w każdej komórce collectionView i ustawiłem ograniczenia, aby wypełnić komórkę, tak aby po kliknięciu komórki klikał przycisk, jednak funkcja przycisków była pusta, więc nic nie było wydaje się, że się dzieje.
POPRAWKA: Naprawiłem to, usuwając przycisk z komórki widoku kolekcji.
źródło