Po dotknięciu wiersza w UITableViewwierszu jest on podświetlony i zaznaczony. Czy można to wyłączyć, więc stuknięcie wiersza nic nie robi?
Po dotknięciu wiersza w UITableViewwierszu jest on podświetlony i zaznaczony. Czy można to wyłączyć, więc stuknięcie wiersza nic nie robi?
Odpowiedzi:
Dla mnie następujące działało dobrze:
tableView.allowsSelection = false
Oznacza to, że didSelectRowAt#po prostu nie będzie działać. Innymi słowy, dotknięcie rzędu stołu jako takiego nie zrobi absolutnie nic. (I dlatego, oczywiście, nigdy nie będzie wybranej animacji.)
(Pamiętaj, że jeśli w komórkach masz UIButtonlub jakiekolwiek inne formanty, oczywiście te formanty nadal będą działać. Wszelkie formanty, które akurat masz w komórce tabeli, są całkowicie niezwiązane ze zdolnością UITableView do umożliwienia Ci „wyboru wiersza” za pomocą didSelectRowAt#.)
Należy również zauważyć, że: To nie działa, gdy UITableViewjest w trybie edycji. Aby ograniczyć wybór komórek w trybie edycji, użyj kodu jak poniżej:
tableView.allowsSelectionDuringEditing = false
selectionStylewłaściwość na komórce: cell.selectionStyle = UITableViewCellSelectionStyle.Nonew Swift lub cell.selectionStyle = UITableViewCellSelectionStyleNonew Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPathzadzwonić, cell.selectionStyle = .Nonejest pożądane. Jeśli nie chcesz lub nie chcesz wywoływać funkcji delegowania (tj. Mając pole tekstowe w tableViewCell) ustawienie tableView.allowsSelection = falsejest w porządku.
Wszystko, co musisz zrobić, to ustawić styl selekcji na UITableViewCellinstancji za pomocą:
Cel C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
lub
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 i 4.x:
cell.selectionStyle = .none
Ponadto upewnij się, że albo nie implementujesz -tableView:didSelectRowAtIndexPath: w widoku delegatu widoku tabeli, albo jawnie wykluczysz komórki, których nie chcesz wykonywać, jeśli je zaimplementujesz.
Ponieważ niedawno przeczytałem ten post i pomogło mi to, chciałem opublikować kolejną odpowiedź, aby skonsolidować wszystkie odpowiedzi (dla potomności).
Tak więc w rzeczywistości istnieje 5 różnych odpowiedzi w zależności od pożądanej logiki i / lub wyniku:
1. Aby wyłączyć niebieskie podświetlenie bez zmiany jakiejkolwiek innej interakcji komórki:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Używam tego, gdy mam UIButton - lub inne kontrolki - hostowane w UITableViewCell i chcę, aby użytkownik mógł wchodzić w interakcje z kontrolkami, ale nie z samą komórką.
UWAGA : Jak zauważył powyżej Tony Million, NIE zapobiega totableView:didSelectRowAtIndexPath: . Aby obejść ten problem, używam prostych instrukcji „jeśli”, najczęściej testując sekcję i unikając działań dla określonej sekcji.
Innym sposobem, w jaki pomyślałem o przetestowaniu podsłuchu takiej komórki, jest:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// A case was selected, so push into the CaseDetailViewController
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
// Handle tap code here
}
}
2. Aby to zrobić dla całej tabeli, możesz zastosować powyższe rozwiązanie do każdej komórki w tabeli, ale możesz również to zrobić:
[tableView setAllowsSelection:NO];
W moich testach nadal pozwala to UITableViewCellna interaktywne sterowanie wewnątrz .
3. Aby ustawić komórkę jako „tylko do odczytu”, możesz po prostu to zrobić:
[cell setUserInteractionEnabled:NO];
4.Aby uczynić całą tabelę „tylko do odczytu”
[tableView setUserInteractionEnabled:NO];
5. Aby określić w locie, czy podświetlić komórkę (która zgodnie z tą odpowiedzią domyślnie obejmuje wybór), możesz zaimplementować następującą UITableViewDelegatemetodę protokołu:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:, co jest ogólnie (nie zawsze) moim preferowanym podejściem.
Podsumowując, moim zdaniem, prawidłowe odpowiedzi są oparte na moim własnym doświadczeniu we wdrażaniu tego:
Jeśli chcesz wyłączyć zaznaczanie tylko niektórych komórek, użyj:
cell.userInteractionEnabled = NO;
Oprócz zapobiegania selekcji, zatrzymuje to również tableView: didSelectRowAtIndexPath: wywoływane dla komórek, które mają ustawione. (Podziękowania dla Tony'ego Milliona za tę odpowiedź, dziękuję!)
Jeśli masz w komórkach przyciski, które należy kliknąć, musisz zamiast tego:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
musisz też zignorować kliknięcia komórki w - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.
Jeśli chcesz wyłączyć zaznaczanie dla całej tabeli, użyj:
tableView.allowsSelection = NO;
(Podziękowania dla Paulo De Barrosa, dzięki!)
Od iOS 6.0 UITableViewDelegatema tableView:shouldHighlightRowAtIndexPath:. (Przeczytaj o tym w Dokumentacji iOS ).
Ta metoda pozwala oznaczyć określone wiersze jako nie do podświetlenia (i domyślnie, nie można ich wybrać) bez konieczności zmiany stylu wyboru komórki, bałagania się obsługą zdarzeń komórki userInteractionEnabled = NOlub innymi udokumentowanymi tutaj technikami.
Można również wyłączyć wybór wiersza z interfejsem budowniczy siebie wybierając NoSelectionz selectionopcji (Właściwości UITableView) w oknie inspektora, jak pokazano na poniższym obrazie

NAPRAWIONE ROZWIĄZANIE DLA SWIFT 3
cell.selectionStyle = .none
Jeśli chcesz, aby zaznaczenie tylko migało, a nie pozostało w wybranym stanie, możesz zadzwonić pod numer
didSelectRowAtIndexPath
następujące
[tableView deselectRowAtIndexPath:indexPath animated:YES];
więc flashuje wybrany stan i przywraca.
Jeśli ktoś potrzebuje odpowiedzi na Swift :
cell.selectionStyle = .None
Tego używam, cellForRowAtIndexPathpisząc ten kod .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Z UITableViewDelegateprotokołu możesz skorzystać z metody, willSelectRowAtIndexPath
a return niljeśli nie chcesz, aby wiersz był zaznaczony.
W ten sam sposób możesz użyć willDeselectRowAtIndexPathmetody i return niljeśli nie chcesz, aby wiersz się odznaczył.
1- Wszystko, co musisz zrobić, to ustawić styl selekcji naUITableViewCell instancji za pomocą:
Cel C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
lub
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3:
cell.selectionStyle = .none
2 - Nie implementuj - tableView:didSelectRowAtIndexPath:w widoku tabeli delegatelub jawnie wyklucz komórki, których nie chcesz wykonywać, jeśli je wykonasz.
3 - Co więcej, możesz to zrobić również z serii ujęć. Kliknij komórkę widoku tabeli iw Inspektorze atrybutów w obszarze Komórka widoku tabeli zmień menu rozwijane obok opcji Wybór na Brak.
4 - Możesz wyłączyć podświetlenie komórki tabeli za pomocą poniższego kodu w (iOS) Xcode 9, Swift 4.0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
Poniżej fragmentu wyłącz podświetlanie, ale także wyłącz połączenie z didSelectRowAtIndexPath. Więc jeśli nie wdrażasz, didSelectRowAtIndexPathużyj poniższej metody. Należy to dodać podczas tworzenia tabeli. Działa to jednak na przyciskach i UITextFieldwewnątrz komórki.
self.tableView.allowsSelection = NO;Poniżej fragmentu wyłącz wyróżnianie i nie wyłącza połączenia z didSelectRowAtIndexPath. Ustaw styl wyboru komórki na Brak wcellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;Poniżej fragmentu wyłącz wszystko w komórce. Spowoduje to wyłączenie do interakcji buttons, textfields:
self.tableView.userInteractionEnabled = false;Poniżej znajdują się Swiftodpowiedniki powyższych Objective-Crozwiązań:
Zastąpienie pierwszego rozwiązania
self.tableView.allowsSelection = falseZastąpienie drugiego rozwiązania
cell?.selectionStyle = UITableViewCellSelectionStyle.NoneZastąpienie trzeciego rozwiązania
self.tableView.userInteractionEnabled = falseSpróbuj wpisać:
cell.selected = NO;
W razie potrzeby usunie zaznaczenie wiersza.
W Swift3 ...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
Walczyłem też z tym dość obficie, kontrolując moje UITableViewCellzabronione korzystanie z userInteractionEnablednieruchomości. Mam 3-statyczną tabelę statyczną dla ustawień, 2 z datami, 1 z włącznikiem / wyłącznikiem. Po pobawieniu się w Storyboard / IB udało mi się sprawić, że dolnego nie da się wybrać, ale kiedy go dotkniesz, zniknie wybór z jednego z górnych wierszy. Oto obraz WIP moich ustawień UITableView:

Jeśli dotkniesz trzeciego rzędu, nic się nie stanie, wybór pozostanie w drugim rzędzie. Funkcjonalność jest praktycznie kopią ekranu wyboru dodawania czasu wydarzenia w aplikacji Apple's Calendar.
Kod jest zaskakująco kompatybilny, aż do IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Działa to w połączeniu z ustawieniem stylu wyboru na none, dzięki czemu komórka nie miga w przypadku zdarzeń przyziemienia
Musisz tylko wstawić ten kod do cellForRowAtIndexPath
Aby wyłączyć właściwość wyboru komórki: (Podczas stukania komórki).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Korzystam z tego, co działa dla mnie.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Chociaż jest to najlepsze i najłatwiejsze rozwiązanie, aby zapobiec wyświetlaniu podświetlenia w wierszu podczas wyboru
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Chciałbym również zasugerować, że czasami przydatne jest krótkie pokazanie, że wiersz został wybrany, a następnie wyłączenie go. Powiadomi to użytkowników o tym, co zamierzali wybrać:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Możesz także ustawić kolor tła na Wyczyść, aby uzyskać taki sam efekt, jak UITableViewCellSelectionStyleNonew przypadku, gdy nie chcesz / nie możesz użyć UITableViewCellSelectionStyleNone.
Użyłbyś kodu w następujący sposób:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Może to obniżyć wydajność, ponieważ dodasz do każdej komórki dodatkowy kolorowy widok .
Możesz użyć :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
w komórce dla metody wiersza przy ścieżce indeksu w UITableView.
Możesz także użyć:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
w widoku tabeli didselectrowatindexpath metoda.
cell.selectionStyle = UITableViewCellSelectionStyle.nonew Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Miłego kodowania !!!
selectioni oczywiściehighlightingzostaje z tym wyłączony. Wiele wysoko głosowanych odpowiedzi wyjaśnia, jakdisable selectionrozwiązać problem wyłączaniahighlighting. Aby wyłączyć tylko podświetlanie, użyjcell.selectionStyle = .Nonelub przejdź dostoryboard / cell / Selection = None