UITableView didSelectRowAtIndexPath: nie jest wywoływany przy pierwszym dotknięciu

352

Mam problem z UITableView's didSelectRowAtIndexPath.

Moja tabela jest skonfigurowana tak, że kiedy wybieram wiersz, inicjuje nowy kontroler widoku i wypycha go.

Przy pierwszym dotknięciu dowolnego wiersza w tabeli metoda nie zostaje wywołana. Po wybraniu innego wiersza zaczyna on działać normalnie.

Sprawdziłem to, ustawiając punkt przerwania na didSelectRowAtIndexPath. Podczas dodawania NSLogdo metody widzę, że kiedy wybieram drugi wiersz, który w końcu wypycha nowy kontroler widoku, widzę dwie instrukcje dziennika wyświetlane jednocześnie w konsoli.

Jakieś sugestie?

Mark Adams
źródło
2
Czy możesz opublikować swój kod tableView:didSelectRowAtIndexPath:?
gerry3
Miałem ten sam problem, sprawdź moją odpowiedź: stackoverflow.com/a/44097559/1600061
Zsivics Sanel
1
Wysyłka w kolejce głównej rozwiązała mój problem stackoverflow.com/questions/20149167/…
durgeshtrivedi

Odpowiedzi:

1356

Czy przypadkiem wpisałeś przypadkiem De selectRowAtIndexPath?

Ole Begemann
źródło
17
@Dschee nie jest wywoływane przy pierwszym dotknięciu, ponieważ niczego nie odznaczasz. Po wybraniu jednego wiersza, przy próbie wybrania drugiego, pierwszy zostaje odznaczony.
Koleś
19
Dlatego tak mi się podoba.
zbuduj
4
Głosowałem za tym nie dlatego, że raz popełniłem ten błąd. Głosowałem za tym, ponieważ popełniłem ten błąd nie mniej niż 4 razy w ciągu tylu lat, co kosztuje tyle czasu.
Brooks Hanes,
8
O MÓJ BOŻE!! To może być najgorszy błąd, który wprowadziłem do mojego kodu.
Shantanu Paul,
4
ŁAŁ. Zaoszczędził mi tyle czasu.
MortalMan
24

Sprawdź także właściwość wyboru widoku tabeli w pliku xib. W razie potrzeby użyj opcji „Wybór pojedynczy” lub „Wybór wielokrotny”.

includeMe
źródło
2
Ba ha ha ha! Wow, spędziłem 4 godziny próbując to rozgryźć. @includeMe to thecue (salute)! Dzięki!
17

Wystąpił następujący problem:

  • najpierw dotknij z rzędu -> bez efektu, bez wyboru, nigdy
  • drugie dotknięcie i następujące -> zawsze prawidłowe zachowanie zaznaczenia

W moim przypadku mój błąd sprawdzał się Show Selection on Touchw Konstruktorze interfejsów. Możesz odznaczyć to w IB tutaj:

wprowadź opis zdjęcia tutaj

Mam nadzieję, że komuś pomoże

sonxurxo
źródło
Jesteś moim bohaterem! Masz pojęcie, dlaczego jest to ustawienie domyślne? Nie mogę wymyślić żadnej aplikacji, która ma takie zachowanie i myślę, że jest to bardzo dziwne ustawienie domyślne.
Christophe Fondacci
12

Sprawdź, czy w swojej klasie ustawiłeś jakieś rozpoznawanie gestów. Gest usuwania działał dla mnie.

Fan YSR
źródło
Mam obydwa; Rozpoznawanie gestów i didSelectRowAtIndexPath? Jednak zawsze rozpoznawanie gestów ma pierwszeństwo. Nie można dostać się do drugiego. Czy istnieje sposób, aby poradzić sobie z obydwoma, czy też muszę pozbyć się rozpoznawania gestów? Dzięki!
Ron
to musi być na górze :) kosztowało mnie 1 godzinę po 7 latach w rozwoju iOS.
Clown
6

Zastanawiałem się nawet nad opublikowaniem tej odpowiedzi, ponieważ uważam, że gwiazdy są w pewnym sensie wyrównane, aby to się objawiło.

Mam odmianę tego problemu i sprawdziłem inne rozwiązania. W moim widoku tabeli nie przetwarza ostatniego wiersza mojego stołu przy pierwszym dotknięciu. Podkreśla to, ale didSelectRowAtIndexPathnie jest nazywany. Wszystkie pozostałe rzędy działają dobrze. Ale jeśli włączę odbijanie widoku tabeli, wydaje się to rozwiązać problem (ale wtedy musisz poradzić sobie z odbiciem widoku tabeli).

Chase Roberts
źródło
Czy znalazłeś powód, dla którego tak się dzieje? Mam dokładnie ten sam problem. Kiedy wyłączam podskakiwanie przy stole, pierwszy / ostatni rząd w tabeli nie reaguje przy pierwszym dotknięciu. Myślałem, że to błąd, ale minął ponad rok i nadal się dzieje.
filip.karas
Nie. Właśnie włączyłem odbicie od widoku tabeli i zostawiłem to przy tym.
Chase Roberts,
Mam ten problem tylko na iPhonie 5 (iOS 10.3) - naprawiłem włączenie odbicia w widoku tabeli. Bardzo dziwne!
Lee Probert,
4

UITableViewCellSelectionStyleNone został ustawiony dla komórki wyświetlającej ten problem (ios9).

Skończyło się na dzwonieniu

[tableView deselectRowAtIndexPath:indexPath animated:NO];

pierwsza rzecz w

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

co nie jest takie samo, ale wystarcza. zastanawiam się, jaki rodzaj zepsucia stołu przynosi ios10.

Anton Tropashko
źródło
To działało dla mnie, ale potrzebuję obejścia, aby ukryć zaznaczenie bez zmiany jego stylu na Brak. Zastąpiłem, setSelectedale gdy użytkownik trzyma komórkę, pojawia się wybór, który jest niedopuszczalny
MMujtabaRoohani
1

SWIFT 2

Upewnij się, że masz ustawioną wartość true:

self.tableView.allowsSelection = true

Umieść to nad swoim tuż po swoim viewDidLoad()i przedsuper.viewDidLoad()

Lukesivi
źródło
1

SWIFT 3

Jeśli pracujesz z Swift 3 w klasie, która nie jest UITableViewControlleri używasz UITableViewDelegate, być może będziesz musiał użyć metody method:

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

To działało dla mnie, chociaż właśnie migrowałem swój projekt do Swift 3. Jest to dość nowy, więc można to naprawić później.

Adam Smith
źródło
1

Jeśli ustawiłeś dowolny UITapGestureRecognizer w swojej klasie, możesz dodać ten wiersz w didSelectRowAtIndexPath:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

To zadziałało dla mnie.

garridozh
źródło
1

ten problem występuje również podczas pracy z narzędziem rozpoznającym gesty w tabeli. W tym przypadku nie trzeba ich usuwać, wystarczy jedynie upewnić się, że właściwość gestu cancelsTouchesInView = falsejest wartością logiczną, która wpływa na to, czy poprawki są dostarczane do widoku, gdy gest jest rozpoznawany.

Ayoub Nouri
źródło
0

SWIFT 3

Żadna z pozostałych odpowiedzi nie działała w moim przypadku, co naprawiło to dla mnie:

tableView.delaysContentTouches = false

Diogo Martins
źródło
0

didSelectRowAtfunkcja nie została wywołana w mojej aplikacji po pierwszym lub drugim dotknięciu ... Próbowałem rozwiązać problem, nie mogłem znaleźć żadnego rozwiązania. Ale nagle zostałem rozpoznany, korzystałem z view.animation zmiana koloru ... Delegatemetoda nie została wywołana, dopóki animacja trwa

Beyaz
źródło
0

W moim przypadku miałem nagłówek sekcji UITableView z rozpoznawaczem gestów. Kiedy nagłówek jest stuknięty, powinien wstawić kilka wierszy do tej sekcji i animować wstawianie (jak sekcja rozwijania / zwijania). Po pierwszym rozwinięciu i dotknięciu metoda delegowania didSelectRow nie została uruchomiona. W przypadku kolejnych dotknięć i akcji rozwijania / zwijania działało to zgodnie z oczekiwaniami.

Na odpowiedź @Ayoub Nouri ustawiłem cancelsTouchesInView na false, co rozwiązało problem. tapGestureRecognizer? .cancelsTouchesInView = false

Kabeer
źródło
0

Szybki 4.2

Wyłączenie „Opóźnij przyziemienie” w inspektorze atrybutów rozwiązało problem.
Następnie kliknięcia są płynne, a didSelectRowAt odpala natychmiast.

Inspektor atrybutów XCode

Aviv Mor
źródło
0

To, co zadziałało, to zacząłem pisać „didSelect ...”, a następnie pozwolić autokorekcie wypełnić resztę. Najwyraźniej jakiś szczegół mojej składni był niepewny. Jak powiedzieli inni, użyj IDE !!

safari żółty
źródło