Piszę aplikację na iOS z widokiem tabeli w widoku karty. W moim przypadku UITableViewController
zaimplementowałem -tableView:didSelectRowAtIndexPath:
, ale kiedy wybieram wiersz w czasie wykonywania, metoda nie jest wywoływana. Widok tabeli jest jednak zapełniany, więc wiem, że wywoływane są inne metody tableView w moim kontrolerze.
Czy ktoś ma jakieś pomysły, co spieprzyłem, aby tak się stało?
ios
uitableview
cocoa-touch
didselectrowatindexpath
Matt Pfefferle
źródło
źródło
UITableView
?-didSelectRowAtIndexPath
. Zrozumiałem czapkę, ponieważ mam widok rozpoznawania gestów w widoku stołu i gest musi zawieść najpierw przed dotknięciem. Rozpoznawanie gestów nie wpływa na animację wyboru stołu.Odpowiedzi:
Wygląda na to, że klasa nie jest odpowiednia
UITableViewDelegate
do tego widoku tabeli, choćUITableViewController
powinna to ustawić automatycznie.Czy jest jakaś szansa, że przywrócisz delegata do innej klasy?
źródło
Na wypadek, gdyby ktoś popełnił ten sam głupi błąd, co ja:
Sprawdź, czy nazwa metody, której się spodziewasz,
didSelect
może zostać przypadkowo uzyskanadidDeselect
. Dowiedziałem się około dwóch godzin ...źródło
Inną rzeczą, która może prowadzić do problemu, jest nie wybrany rodzaj wyboru:
Powinien być
Single Selection
do normalnego wyboru, nie powinien byćNo Selection
.Aby to zrobić programowo, wykonaj:
źródło
Inną możliwością jest to, że UITapGestureRecognizer może jeść wydarzenia, jak miało to miejsce tutaj: https://stackoverflow.com/a/9248827/214070
Nie podejrzewałem tej przyczyny, ponieważ komórki tabeli nadal podświetlałyby się na niebiesko, jakby krany się przedostawały.
źródło
didSelectRowAtIndexPath
nie działa tylko po usunięciu komórki wcommitEditingStyle
. Następnie robięUITapGestureRecognizer
itapAction:
dostałindexPath
odsender.view
([self.tableView indexPathForCell:sender.view]
) i wywołanie[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Wszystkie dobre odpowiedzi, ale jest jeszcze jedna rzecz, na którą należy zwrócić uwagę ...
(W szczególności przy programowym tworzeniu UITableView)
Upewnij się, że tableView może zareagować na wybór, ustawiając
[tableView setAllowsSelection:YES];
lub usuwając linię, która go ustawiaNO
.źródło
setAllowsSelectionDuringEditing:
do listy (gdy widok tabeli jest w trybie edycji)Single Selection
.Jeśli pojawi się problem,
UITapGestureRecognizer
możesz to naprawić:w kodzie z
Objective-C
:w kodzie z
Swift
:źródło
W takich sytuacjach spotkałem dwie rzeczy.
Możliwe, że zapomniałeś wdrożyć protokół UITableViewDelegate lub nie ma punktu delegacji między klasą a widokiem tabeli.
Możesz mieć UIView w swoim rzędzie, który jest pierwszym respondentem i zabiera kliknięcia. Powiedz przycisk UIB lub coś podobnego.
źródło
Miałem ten sam problem. I trudno było znaleźć. Ale gdzieś w moim kodzie było to:
Musi być
return indexPath
, inaczej-tableView:didSelectRowAtIndexPath:
nie zostanie powołany.źródło
Jeśli dodałeś gestRecognizer na UITableView,
didSelectRowAtIndexPath
nie zostanie wywołany.Musisz więc użyć metody delegowania gestRecognizer, aby uniknąć dotyku w określonym widoku.
źródło
if ([touch.view isDescendantOfView:YourTable])
Wystąpił problem polegający na tym, że po miesiącach nie patrzenia na mój kod zapomniałem, że wdrożyłem następującą metodę z powodu niektórych wymagań, które nie były konieczne
Aby wiersz został wybrany, powinien zwracać TAK.
źródło
MUSISZ wybrać te opcje
ale jeśli chcesz, aby
UITableView
kliknięcie nie było podświetlane, powinieneś wprowadzić zmiany weUITableViewCell
właściwościach.Wybierz opcję Brak dla opcji Wybór, tak jak poniżej
źródło
Położyłem
UITapGestureRecognizer
widok na stole, aby zwolnić klawiaturę, która uniemożliwiładidSelectRowAtIndexPath:
wywołanie. Mam nadzieję, że to komuś pomoże.źródło
Jeśli masz ten sam problem co ja: Najwyraźniej ta metoda nie zostanie wywołana, jeśli tableView jest w trybie edycji. Musisz ustawić allowSelectionDuringEditing na true.
Poprzez to pytanie: Podczas edycji, `UITableView` nie wywołuje didSelectRowAtIndexPath ??
źródło
Miałem ten sam problem
Powodem było użycie
UITapGestureRecognizer
. Chciałem zamknąć klawiaturę, kiedy stuknąłem gdziekolwiek indziej. Uświadomiłem sobie, że to nadpisuje wszystkie akcje z kranu, dlategodidSelectRowAtIndexPath
funkcja nie została wywołana.Kiedy komentuję powiązane wiersze
UITapGestureRecognizer
, działa. Ponadto możesz sprawdzić,UITapGestureRecognizer selector
czy podsłuch jest wciśnięty,UITableViewCell
czy nie.źródło
W moim przypadku, didSelctRowAtIndexPath niestawienie wynika, że wybrano żadnego w Doboru własności Tableview, zestaw do pojedynczego wyboru rozwiązać mój problem
źródło
Dla Xcode 6.4, Swift 1.2. „Tag” wyboru został zmieniony w IB. Nie wiem jak i dlaczego. Ustawienie go na „Pojedynczy wybór” sprawiło, że moje komórki widoku tabeli można ponownie wybrać.
źródło
Mimo że inna odpowiedź została zaakceptowana, dodam jeszcze jeden możliwy problem i rozwiązanie dla osób, które zauważą ten problem:
Jeśli masz włączone automatyczne zliczanie referencji (ARC), może się okazać, że nawet po przypisaniu kontrolera jako delegata widoku, wiadomości widoku do kontrolera nie są odbierane, ponieważ ARC usuwa kontroler. Najwyraźniej wskaźnik delegowania UITableView nie jest liczony jako odwołanie do ARC, więc jeśli jest to jedyne odniesienie, kontroler zostanie zwolniony. Możesz sprawdzić, czy tak się dzieje, implementując metodę dealloc na kontrolerze i ustawiając tam punkt przerwania lub wywołanie NSLog.
Rozwiązaniem jest śledzenie kontrolera z silnym odniesieniem w innym miejscu, dopóki nie będziesz pewien, że już go nie potrzebujesz.
źródło
Pamiętaj, aby ustawić źródło danych i delegować w metodzie viewDidLoad w następujący sposób:
źródło
Moim problemem nie był żaden z powyższych. I taki kiepski. Ale pomyślałem, że wymienię to tutaj, na wypadek, gdyby komuś to pomogło.
Mam
tableViewController
kontroler „podstawowy”, a następnie tworzę podklasy tego kontrolera. Cały mój kod zapisywałemtableView:didSelectRowAtIndexPath
rutynowo w klasie „podstawowej”. Całkowicie zapominając, że domyślnie ta procedura również została stworzona (choć bez kodu, który nic nie zrobiłby) we wszystkich moich podklasach. Więc kiedy uruchomiłem moją aplikację, uruchomiłem wersję podklasy kodu, nic nie zrobiłem i zasmuciło mnie. Więc oczywiście, kiedy usunąłem procedurę z podklas, użyłem procedury klasy mt „base” i jestem w biznesie.Wiem. Nie śmiej się Ale może to uratuje kogoś straconą godzinę ...
źródło
Dając za to moje 2 centy.
Miałem niestandardowe UITableViewCell i był przycisk pokrywający całą komórkę, więc kiedy nastąpił dotyk, przycisk został wybrany, a nie komórka.
Albo usuń przycisk, albo w moim przypadku ustawiłem opcję Włącz interakcję użytkownika na wartość false, w ten sposób wybrana została komórka.
źródło
Jeśli to przeczytasz, nadal nie rozwiążesz problemu.
Mam komórkę niestandardową , w której pole wyboru „ Interakcja użytkownika włączona ” było wyłączone. Więc po prostu go włączam. Powodzenia.
źródło
Właśnie to miałem i jak mi się przydarzyło w przeszłości, to nie działało, ponieważ nie zwracałem uwagi na autouzupełnianie podczas próby dodania metody, a tak naprawdę kończę na implementacji
tableView:didDeselectRowAtIndexPath
: zamiasttableView:didSelectRowAtIndexPath:
.źródło
Upewnij się, że został wdrożony
tableView:didSelectRowAtIndexPath
a nietableView:didDeSelectRowAtIndexPath
Dostałem to więcej niż kilka razy !!
źródło
Wiem, że jest stary i problem został rozwiązany, ale miał podobny problem, myślałem, że problem dotyczy mojego niestandardowego UITableViewCell, ale rozwiązanie było zupełnie inne - ponownie uruchamiam XCode :), a następnie działa dobrze! prawie jak Windows :)
źródło
Jeśli widok tabeli jest w trybie edycji (np.
[tableView setEditing:YES animated:NO];
), Musisz ustawićtableView.allowsSelectionDuringEditing = YES;
źródło
Kolejny błąd, który mogłeś popełnić (tak jak ja): jeśli ustawisz segue w komórce,
didSelectRowAtIndexPath
nie jest wywoływany. Zamiast tego powinieneś ustawić swoje sekwencje na kontrolerze widoku.źródło
Żadna z tych odpowiedzi nie działała dla mnie. Po około godzinie wymyśliłem coś bardzo podstępnego:
Mam widok tabeli wewnątrz komórki innego widoku tabeli. Postanowiłem zrobić widok obejmujący między innymi widok wewnętrznego stołu. Nazwałem ten widok contentView i podłączyłem go do xib.
Okazuje się, że UITableViewCell ma już contentView i robi z nim dziwne rzeczy. Problem rozwiązał się, gdy zmieniłem nazwę właściwości na mainContentView i ponownie podłączyłem widok do tej właściwości o zmienionej nazwie.
źródło
W moim przypadku, dynamicznie obliczyć wysokość
TableView
„sSuperView
w czasie ładowania. Z powodu błędnej kalkulacjiTableView
został umieszczony pozaSuperView
.TableView
Został sporządzony grzywny, jednak wszystko interakcja była wyłączona (ididSelectRowAtIndexPath
nigdy nie został powołany). Bardzo trudny do wykrycia, ponieważ nie ma wizualnego wskazania, żeTableView
nie jest „dostępny”.źródło
W moim przypadku problem polegał na tym, że miałem
UITableViewCell
podklasę i zaimplementowałem dwie metody:touchesBegan:withEvent:
itouchesEnded:withEvent
obsługiwać fantazyjną animację dotykową. Ale zapomniałem dodać[super touchesBegan:touches withEvent:event];
reklamę metody,[super touchesEnded:touches withEvent:event];
aby poinformować również rodzica komórki o dotyku.Tak więc zmiana kodu na następujący rozwiązała mój problem:
źródło
W moim przypadku rozwiązaniem była zmiana NIE na TAK w poniższej funkcji.
iOS 9+
źródło