Co spowodowałoby, że komórka widoku tabeli pozostałaby podświetlona po dotknięciu? Klikam komórkę i widzę, że pozostaje podświetlona po przesunięciu widoku szczegółów. Po wyświetleniu widoku szczegółowego komórka jest nadal podświetlona.
ios
uitableview
cocoa-touch
4thSpace
źródło
źródło
deselectRowAtIndexPath
w moim viewDidAppear, jeśli zaznaczenie wiersza spowoduje wyświetlenie nowego widoku.-deselectRowAtIndexPath:animated:
metodę w swojej właściwości tableView z-viewDidAppear
. Jeśli jednak masz widok tabeli w podklasie UIViewController, powinieneś wywołać-deselectRowAtIndexPath:animated:
od-viewDidAppear
siebie. :)-viewWillAppear:
które go zepsuło. Dodanie połączenia, aby[super viewWillAppear:animated]
znów działało.UITableViewController
„sclearsSelectionOnViewWillAppear
właściwość jest ustawiona naYES
(co jest domyślne), a ty nie zapobiegły[super viewWillAppear]
z której dzwonimy.Najprostszym sposobem na to jest viewWillAppear:
W ten sposób masz animację wygaszania zaznaczenia po powrocie do kontrolera, tak jak powinno.
Zaczerpnięte z http://forums.macrumors.com/showthread.php?t=577677
Szybka wersja
źródło
viewDidAppear
.indexPathForSelectedRow
Wywołanie może zwrócić nil, więc powinno być sprawdzone. Dokumentacja stwierdza : Ścieżka indeksu identyfikująca indeksy wierszy i sekcji wybranego wiersza lub zero, jeśli ścieżka indeksu jest nieprawidłowa.Czy masz podklasę
-(void)viewWillAppear:(BOOL)animated
? Wybrana UITableViewCell nie zostanie odznaczona, gdy nie wywołasz[super viewWillAppear:animated];
metody niestandardowej.źródło
Dla użytkowników Swift dodaj to do swojego kodu:
To odpowiedź Paulthenerda, z wyjątkiem Swift zamiast Obj-C.
źródło
Rozwiązanie Swift 3
źródło
Jeśli używasz UITableViewCell, skomentuj następujący wiersz
Mam nadzieję że to pomoże.
źródło
Zaktualizowano za pomocą Swift 4
Po kilku eksperymentach, również opartych na wcześniejszych odpowiedziach, doszedłem do wniosku, że najlepsze zachowanie można osiągnąć na 2 sposoby: (w praktyce prawie identyczne)
Osobiście przyjmuję pierwsze rozwiązanie, ponieważ jest po prostu bardziej zwięzłe. Inną możliwością, jeśli potrzebujesz trochę animacji po powrocie do tableView, jest użycie
viewWillAppear
:Wreszcie, jeśli używasz UITableViewController, możesz również skorzystać z właściwości clearsSelectionOnViewWillAppear .
źródło
Aby uzyskać zachowanie, które Kendall Helmstetter Gelner opisuje w swoim komentarzu, prawdopodobnie nie chcesz deselectRowAtIndexPath, ale raczej właściwości clearsSelectionOnViewWillAppear na kontrolerze. Być może przez przypadek został ustawiony na TAK?
Zobacz komentarz w domyślnym szablonie Apple dla nowych podklas UITableViewController:
źródło
Ten problem występował również w przypadku mojej aplikacji do przechodzenia do szczegółów. Po tym, jak kontroler widoku, który nazwiemy VC, powróci po wciśnięciu innego kontrolera ViewController, wybrana komórka w VC pozostała podświetlona. W mojej aplikacji utworzyłem VC, aby obsłużyć drugi poziom (z trzech poziomów) mojego drążenia.
Problem w moim przypadku polega na tym, że VC był UIViewController (który zawierał View, który zawierał TableView). Zamiast tego zrobiłem VC jako UITableViewController (który zawierał TableView). Klasa UITableViewController automatycznie obsługuje usuwanie podświetlenia komórki tabeli po powrocie z wypychania. Druga odpowiedź na post „ Problem z deselectRowAtIndexPath w tableView ” daje pełniejszą odpowiedź na ten problem.
Problem nie wystąpił w przypadku głównego kontrolera widoku, ponieważ kiedy utworzyłem aplikację jako „aplikację opartą na nawigacji” w XCode, wynikowy główny kontroler widoku został już utworzony w podklasie UITableViewController.
źródło
Jeśli żadne z tych rozwiązań nie działa, rozważ to obejście:
Użyj odprężającej kolejki, aby zadzwonić:
Czemu to robić? Przede wszystkim, jeśli masz problemy z uruchomieniem kodu odznaczenia we właściwym czasie. Miałem problem z tym, że nie działał on na widoku WillAppear, więc odprężenie działało znacznie lepiej.
Kroki:
Napisz rozwijanie płynności (lub wklej od góry) do pierwszego VC (tego z tabelą)
Idź do drugiego VC. Przeciągnij z wciśniętym klawiszem Control z przycisku Anuluj / Gotowe / Etc, którego używasz, aby odrzucić ten WK i przeciągnij do ikony Zakończ u góry.
Wybierz rozwijanie płynnej ścieżki utworzonej w kroku 1
Powodzenia.
źródło
Używam CoreData, więc kod, który działał dla mnie, był połączeniem pomysłów z różnych odpowiedzi, w Swift:
źródło
źródło
Od dłuższego czasu mam ten sam problem, więc na wypadek, gdyby ktoś inny miał problemy:
Przyjrzyj się swojemu
-tableView: cellForRowAtIndexPath:
i zobacz, czy tworzysz komórki, czy używasz „identyfikatora ponownego wykorzystania”. Jeśli to drugie, upewnij się, że twoja tabela w IB ma komórkę z tym identyfikatorem. Jeśli nie używasz identyfikatora ponownego wykorzystania, po prostu utwórz nową komórkę dla każdego wiersza.To powinno dać twojej tabeli oczekiwany efekt „zanikania wybranego wiersza” po pojawieniu się.
źródło
Użyj tej metody w klasie UITableViewCell
źródło
W przypadku Swift 3: wolałbym, aby był używany w widokuDidDisappear
Definiować:-
W widoku Zniknął: -
W didSelectRowAtIndexPath: -
źródło
jeśli komórka pozostaje podświetlona po dotknięciu, można wywołać metodę UITabelView,
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
Możesz też skorzystać z poniższej metody i zmodyfikować ją zgodnie ze swoimi wymaganiami,
// ZNAK: UITableViewDelegate
źródło
Xcode 10, Swift 4
Miałem ten sam problem i odkryłem, że zostawiłem puste wywołanie viewWillAppear na dole mojego tableViewController. Po usunięciu pustej funkcji nadpisywania wiersz nie był już podświetlony po powrocie do widoku tableView.
problem func
usunięcie pustej funkcji rozwiązało mój problem.
źródło
Rozwiązanie Swift 5:
źródło