Jak mogę wyłączyć opcję UITableView?

1192

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?

DavidM
źródło
17
Oryginalne pytanie ma zły tytuł. OP chce przede wszystkim wyłączyć selectioni oczywiście highlightingzostaje z tym wyłączony. Wiele wysoko głosowanych odpowiedzi wyjaśnia, jak disable selectionrozwiązać problem wyłączania highlighting. Aby wyłączyć tylko podświetlanie, użyj cell.selectionStyle = .Nonelub przejdź dostoryboard / cell / Selection = None
Andrej
Zaktualizuj tytuł lub post. Jestem zmieszany. I na podstawie tego pytania nie mam pojęcia, co mają na celu udzielone odpowiedzi.
Daniel Springer

Odpowiedzi:

603

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 
Stwórzmy
źródło
6
to w końcu zadziałało, próbowałem użyć cell.selectionStyle = UITableViewCellSelectionStyleNone; ale to nie zadziałało. Jedną rzeczą do zapamiętania: powinna być: tableView.allowsSelection = NO; nie fałsz.
tony.tc.leung
6
Myślę, że to najlepsza opcja. Przyciski na komórkach są przy tym aktywne, ale tekst nie jest aktywny.
Fahim Parkar,
513
Jak to jest akceptowana odpowiedź i ma tyle głosów? W ogóle nie odpowiada na pytanie! Musisz ustawić selectionStylewłaściwość na komórce: cell.selectionStyle = UITableViewCellSelectionStyle.Nonew Swift lub cell.selectionStyle = UITableViewCellSelectionStyleNonew Objective-C.
nodebase
5
To działa dla mnie w szybkim 2.tableView.allowSelection = false
Khanad
15
Można to zrobić na kilka sposobów w zależności od potrzeb. Żaden styl selekcji i żadna selekcja nie mogą działać, lub obie mogą zawieść. Oto przykład. Jeśli chcesz wybrać komórkę i 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.
Made2k
1963

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.

Więcej informacji tutaj i tutaj

Martin Gordon
źródło
122
@ Tony To zły pomysł, jeśli masz UITextField w komórce.
Aniruddh Joshi
73
@TonyMillion to również zły pomysł, jeśli chcesz korzystać z wbudowanych elementów sterujących edytowaniem, takich jak przeciąganie, aby usunąć. Jeśli ustawisz UserInteractionEnabled na NO, przycisk usuwania nie będzie reagował na zdarzenia dotykowe użytkownika.
Carlos P,
47
późno do tego wątku, ale zamiast userInteraction, użyj cell.allowsSelection. To zatrzymuje metody interakcji komórki, ale nie blokuje zwykłych odpowiedzi uIView.
Chris C,
4
Ustawienie cell.userInteractionEnable = Nie nie przestanie wyzwalać didSelectRowAtIndexPath.
user4951
25
Podniosę głosowanie nad odpowiedzią, ale dla jasności, OP poprosił jedynie o wyłączenie „podświetlania”, a nie o wyłączenie interakcji całej komórki, więc wszystkie te komentarze są nie na temat.
Frederic Yesid Peña Sánchez
353

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
mbm29414
źródło
3
Jeśli wczytasz projekt komórki ze stalówki, pole wyboru (w IB) będzie działało dobrze dla nr 3 (i dla tabel dla nr 4). Czy dla # 4 vs # 2 jest różnica, czy elementy sterujące w komórce będą interaktywne?
lilbyrdie,
4
Tak. Jeśli chcesz wyłączyć wybór, ale zezwolić UIButtonom itp., Aby nadal wspierał interakcję użytkownika, użyj # 2. Jeśli chcesz komórkę całkowicie tylko do odczytu, użyj # 4. Oczywiście, dlaczego nie mam UIViews lub UILabels w nieinteraktywnej komórce, jest poza mną. Może ktoś chciałby wyłączyć wszystkie interakcje, gdy dzieje się coś innego.
mbm29414,
8
# 4 to okropny pomysł, ponieważ spowoduje to wyłączenie przewijania w widoku tabeli
simon
4
@simon Właściwie to nie jest straszny pomysł; jest to jedna opcja, która może, ale nie musi być dobrą opcją, w zależności od okoliczności. Również # 4 wyłącza przewijanie USER; w razie potrzeby możesz nadal wdrożyć własne. Zgadzam się, że nr 4 nie jest WIELKI, ale nie jest to okropny pomysł.
mbm29414
3
Dla kompletności proszę dodać okrzyk tableView:shouldHighlightRowAtIndexPath:, co jest ogólnie (nie zawsze) moim preferowanym podejściem.
Benjohn
82

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!)

JosephH
źródło
co jeśli mamy przycisk w naszej komórce?
Umair Afzal
56

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.

cbowns
źródło
2
Natknąłem się na ten wątek i byłem zszokowany, widząc tak wiele innych odpowiedzi przed tym. Jest to bez wątpienia właściwy sposób.
beebcon
2
To jest rzeczywiście poprawna i jedyna odpowiedź, którą należy wziąć pod uwagę. Wszystko inne, co wspomina interakcję użytkownika, jest całkowicie niepoprawne.
mattyohe
50

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

UITableView Inspector

Vignesh Kumar
źródło
2
Najlepsze rozwiązanie IMHO
Itai Spector
Często używam tego rozwiązania
Evsenev
46

NAPRAWIONE ROZWIĄZANIE DLA SWIFT 3

cell.selectionStyle = .none
MANISH PATHAK
źródło
36

W swojej UITableViewCell„s XIB w zestaw atrybutów Inspektor wartości Selectiondo None.

wprowadź opis zdjęcia tutaj

Zaid Pathan
źródło
Właśnie tego potrzebowałem. Nadal chciałem powiadomienia didSelect ... ale bez widocznego wskazania wyboru. Dzięki!
Timothy Tripp
Cieszę się, że pomogło! :)
Zaid Pathan
35

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.

Chris Fox
źródło
3
Przy takim podejściu rząd natychmiast się wyróżnia, a następnie zanika w ciągu pół sekundy. W ten sposób Apple stylizuje swoje menu Ustawienia, więc dla mnie wygląda dobrze.
VinceFior,
34

Jeśli ktoś potrzebuje odpowiedzi na Swift :

cell.selectionStyle = .None
Aks
źródło
1
możemy również użyć tego cell.selectionStyle = UITableViewCellSelectionStyle.None
prawdopodobnie
29

Tego używam, cellForRowAtIndexPathpisząc ten kod .:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ahsan Ebrahim
źródło
28

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ł.

użytkownik 41806
źródło
5
Nie podoba mi się ta metoda, ponieważ nadal pokazuje komórkę w jej podświetlonym stanie, dopóki nie zostanie poprawiona.
kbanman
2
właśnie dlatego mi się podoba :-)
Joris Weimar
24

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


}
parvind
źródło
20

Cel C:

  1. 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;
  2. 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;
  3. Poniżej fragmentu wyłącz wszystko w komórce. Spowoduje to wyłączenie do interakcji buttons, textfields:

    self.tableView.userInteractionEnabled = false;

Szybki:

Poniżej znajdują się Swiftodpowiedniki powyższych Objective-Crozwiązań:

  1. Zastąpienie pierwszego rozwiązania

    self.tableView.allowsSelection = false
  2. Zastąpienie drugiego rozwiązania

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. Zastąpienie trzeciego rozwiązania

    self.tableView.userInteractionEnabled = false
Arun Gupta
źródło
19

Spró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)
}
Denis Kutlubaev
źródło
14

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:

Ustawienia 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

Yarek T.
źródło
11

Możemy pisać jak kod

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

ale gdy mamy XIb zwyczaj komórek powyższej linii udzielić ostrzeżenia w tamtym czasie

niestandardowe komórki xib

musimy ustawić styl wyboru Żadne z konstruktora interfejsu

iDhaval
źródło
11

Musisz tylko wstawić ten kod do cellForRowAtIndexPath

Aby wyłączyć właściwość wyboru komórki: (Podczas stukania komórki).

cell.selectionStyle = UITableViewCellSelectionStyle.None
Gaurav Patel
źródło
Dziękuję, mam obraz w komórce i etykietę nad nim. Ustawiłem tło etykiety, ale za każdym razem, gdy kliknę, tło zniknie, to rozwiązało.
Darko
10

Spróbuj tego

cell.selectionStyle = UITableViewCellSelectionStyleNone;

i

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

a także możesz ustawić styl wyboru za pomocą konstruktora interfejsów.

v_1
źródło
10

Korzystam z tego, co działa dla mnie.

cell?.selectionStyle = UITableViewCellSelectionStyle.None
priyanka gautam
źródło
7

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];
...
}
Steve Barden
źródło
7

Bezpośrednio wyłącz podświetlanie TableViewCell w serii ujęć

wprowadź opis zdjęcia tutaj

Kamani Jasmin
źródło
6

Aby wyłączyć podświetlenie komórki UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

I nie powinien pozwalać użytkownikowi na interakcję z komórką.

cell.userInteractionEnabled = NO;
Sharme
źródło
6

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 .

virindh
źródło
6

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.

Annu
źródło
Jest teraz cell.selectionStyle = UITableViewCellSelectionStyle.nonew Swift 3.
Dan
5

Możesz tego użyć

cell.selectionStyle = UITableViewCellSelectionStyleNone;
iEinstein
źródło
5

Możesz użyć ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Mak083
źródło
5
cell.selectionStyle = UITableViewCellSelectionStyleNone;
iDeveloper
źródło
5
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Miłego kodowania !!!

Rinku Sadhwani
źródło
5

Możesz to również zrobić z storyboardu. Kliknij komórkę widoku tabeli iw Inspektorze atrybutów w obszarze Komórka widoku tabeli zmień menu rozwijane obok opcji Wybór na Brak.

Cindy
źródło