Jak Mogę wyłączyć wybór UITableView?

Po dotknięciu wiersza w UITableView wiersz jest podświetlony i zaznaczony. Czy można to wyłączyć, aby stukanie w wiersz nic nie dało?

Author: Malik, 2008-10-10

30 answers

Dla mnie, następujące działa dobrze:

tableView.allowsSelection = NO;

To znaczy didSelectRowAt# po prostu nie zadziała. Oznacza to, że dotknięcie rzędu stołu jako takiego nie zrobi absolutnie nic. (A więc oczywiście nigdy nie będzie wybranej-animacji.)

(zauważ, że jeśli na komórkach masz UIButton lub jakiekolwiek inne kontrolki, oczywiście te kontrolki nadal będą działać. Wszelkie kontrolki, które masz na komórce tabeli, są całkowicie niezwiązane ze zdolnością UITableView pozwalającą " wybrać wiersz " używając didSelectRowAt#.)

 510
Author: Fattie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 19:11:27

Wszystko, co musisz zrobić, to ustawić styl zaznaczenia na instancji UITableViewCell używając:

Objective-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 zaimplementujesz -tableView:didSelectRowAtIndexPath: w delegacie widoku tabeli, albo wyraźnie wyklucz komórki, które mają nie mieć akcji, jeśli ją zaimplementujesz.

Więcej informacji tutaj i tutaj

 1863
Author: Martin Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 09:33:10

Ponieważ czytałem ten post niedawno i pomógł mi, chciałem dodać 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 żądanej logiki i / lub wyniku:

1.To wyłącz niebieskie podświetlenie bez zmiany jakiejkolwiek innej interakcji komórki:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Używam tego, gdy mam UIButton-lub inną kontrolę(s) - hostowaną w UITableViewCell i chcę użytkownika, aby móc wchodzić w interakcje z kontrolkami, ale nie z samą komórką.

Uwaga: Jak zauważył Tony Million, nie zapobiega to tableView:didSelectRowAtIndexPath:. Rozumiem to za pomocą prostych stwierdzeń "jeśli", najczęściej testujących dla danej sekcji i unikających działań dla danej sekcji.

Innym sposobem, który pomyślałem, aby przetestować pod kątem stukania komórki takiej jak ta, 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.To zrób to dla całej tabeli, możesz zastosować powyższe rozwiązanie do każdej komórki w tabeli, ale można też to zrobić:

[tableView setAllowsSelection:NO];

w moich testach nadal pozwala to na interaktywne sterowanie wewnątrz UITableViewCell.


3.To zrób komórkę "tylko do odczytu", możesz po prostu to zrobić:

[cell setUserInteractionEnabled:NO];



4.To Utwórz całą tabelę"tylko do odczytu"

[tableView setUserInteractionEnabled:NO];



5.To określ w locie, czy podświetlić komórkę (co zgodnie z ta odpowiedź domyślnie zawiera zaznaczenie), możesz zaimplementować następująca metoda protokołu UITableViewDelegate:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
 339
Author: mbm29414,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:30

Podsumowując to, co uważam za poprawne odpowiedzi oparte na moim własnym doświadczeniu w realizacji tego:

Jeśli chcesz wyłączyć zaznaczanie tylko dla niektórych komórek, użyj:

cell.userInteractionEnabled = NO;

Oprócz zapobiegania zaznaczeniu, zatrzymuje to również wywołanie tableView:didSelectRowAtIndexPath: dla komórek, które go ustawiły. (Kredyt idzie do Tony Million za tę odpowiedź, dzięki!)

Jeśli masz w komórkach przyciski, które trzeba kliknąć, musisz zamiast tego:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Oraz musisz również zignorować wszelkie kliknięcia na komórkę w - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

Jeśli chcesz wyłączyć zaznaczenie dla całej tabeli, użyj:

tableView.allowsSelection = NO;
(Podziękowania dla Paulo De Barros, dzięki!)
 76
Author: JosephH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-07 08:45:25

Od wersji iOS 6.0, UITableViewDelegate mA tableView:shouldHighlightRowAtIndexPath:. (Przeczytaj o tym w dokumentacji iOS .)

Ta metoda pozwala oznaczyć określone wiersze jako niewykrywalne (i domyślnie niewykrywalne) bez konieczności zmiany stylu zaznaczenia komórki, mieszania w obsłudze zdarzeń komórki za pomocą userInteractionEnabled = NO lub innych udokumentowanych tutaj technik.

 50
Author: cbowns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-31 21:48:47

Możesz również wyłączyć wybór wiersza z samego konstruktora interfejsu, wybierając NoSelection z opcji selection (właściwości UITableView) w panelu Inspektora, jak pokazano na poniższym obrazku

UITableView Inspector

 45
Author: vignesh kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 05:46:38

ROZWIĄZANIE STAŁE DLA SWIFT 3

cell.selectionStyle = .none
 42
Author: MANISH PATHAK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 19:37:39

W przypadku, gdy ktoś potrzebuje odpowiedzi na Swift :

cell.selectionStyle = .None
 33
Author: Aks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-02 09:39:43

Jeśli chcesz, aby selekcja migała tylko, a nie pozostała w wybranym stanie, możesz wywołać w

didSelectRowAtIndexPath

Następujące

[tableView deselectRowAtIndexPath:indexPath animated:YES];

Więc będzie migać wybrany stan i powróci.

 31
Author: Chris Fox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-13 15:07:34

W Twoim UITableViewCell ' S XIB w Inspektorze atrybutów ustaw wartość Selection na None.

Tutaj wpisz opis obrazka

 28
Author: Zaid Pathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-05 07:49:18

Z protokołu UITableViewDelegate można użyć metody willSelectRowAtIndexPath i return nil jeśli nie chcesz, aby wiersz został wybrany.

W ten sam sposób można użyć metody willDeselectRowAtIndexPath i return nil, jeśli nie chcesz, aby wiersz odznaczył zaznaczenie.

 27
Author: user41806,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-29 05:57:23

Tego używam:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

W cellForRowAtIndexPath wpisz ten kod.

 22
Author: Ahsan Ebrahim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-30 10:31:58

Spróbuj wpisać:

cell.selected = NO;

W razie potrzeby usunie zaznaczenie twojego 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)
}
 18
Author: wzbozon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-29 22:48:01

Objective-C:

  1. Poniżej fragment wyłącza podświetlanie, ale wyłącza również wywołanie do didSelectRowAtIndexPath. Jeśli więc nie implementujesz didSelectRowAtIndexPath, użyj poniższej metody. Należy to dodać podczas tworzenia tabeli. Będzie to działać na przyciskach i UITextField wewnątrz komórki.

    self.tableView.allowsSelection = NO;
    
  2. Poniżej fragment wyłącza podświetlanie i nie wyłącza wywołania do didSelectRowAtIndexPath. Ustaw styl zaznaczenia komórki na None w cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. Poniżej snippet Wyłącz wszystko w komórce. Spowoduje to wyłączenie interakcji z buttons, textfields:

    self.tableView.userInteractionEnabled = false;
    

Swift:

Poniżej znajdują się Swift odpowiedniki powyższych Objective-C rozwiązań:

  1. Wymiana pierwszego roztworu

    self.tableView.allowsSelection = false
    
  2. Wymiana drugiego roztworu

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

    self.tableView.userInteractionEnabled = false
    
 18
Author: Arun Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-28 16:44:27

Ja też walczyłem z tym dość obficie, posiadając kontrolę w moim UITableViewCellzabraniającym używania userInteractionEnabled własności. Mam statyczną tabelę 3 komórek dla ustawień, 2 z datami, 1 z włącznikiem / wyłącznikiem. Po zabawie w Storyboard/IB udało mi się zrobić dolny nie do wyboru, ale po dotknięciu go wybór z jednego z górnych wierszy znika. Oto obraz WIP moich ustawień UITableView:

Ustawienia UITableView

Jeśli dotkniesz trzeciego rzędu nic się nie dzieje, wybór pozostanie w drugim rzędzie. Funkcjonalność jest praktycznie kopią ekranu wyboru czasu wydarzenia aplikacji kalendarza Apple.

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 zaznaczenia na brak, więc komórka nie migocze przy zdarzeniach dotykowych

 13
Author: Yarek T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-03 21:15:01

Do szybkiego dezelekcji

cell.selectionStyle = .None
 12
Author: parvind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 11:37:52

Możemy napisać kod jak

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

Ale gdy mamy własną Komórkę xib powyżej linii dać ostrzeżenie w tym czasie dla

Custom cell xib

Musimy ustawić styl wyboru None z konstruktora interfejsu

 10
Author: iDhaval,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-24 13:21:09

Wystarczy umieścić ten kod w cellForRowAtIndexPath

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

cell.selectionStyle = UITableViewCellSelectionStyle.None
 10
Author: Gaurav Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-18 05:17:24

Spróbuj tego

cell.selectionStyle = UITableViewCellSelectionStyleNone;

I

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

I możesz również ustawić styl zaznaczenia za pomocą interfejsu.

 9
Author: v_1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-12 10:41:15

Używam tego, co działa na mnie.

cell?.selectionStyle = UITableViewCellSelectionStyle.None
 9
Author: priyanka gautam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 16:03:19

Chociaż jest to najlepsze i najłatwiejsze rozwiązanie, aby zapobiec wyświetlaniu podświetlenia w wierszu podczas zaznaczania

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. To ostrzega użytkowników z potwierdzeniem, co zamierzali wybrać:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
 7
Author: Steve Barden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-20 21:25:24

Możesz również ustawić kolor tła na Wyczyść, aby uzyskać taki sam efekt jak UITableViewCellSelectionStyleNone, jeśli nie chcesz / nie możesz użyć UITableViewCellSelectionStyleNone.

Możesz użyć kodu w następujący sposób:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
To może degradacja twoja wydajność jako dodanie dodatkowego kolorowego widoku do każdej komórki.
 6
Author: virindh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-14 01:43:02

Aby wyłączyć podświetlanie UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

I nie powinny pozwolić użytkownikowi na interakcję z komórką.

cell.userInteractionEnabled = NO;
 5
Author: Sharme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 00:51:00

Możesz użyć tego

cell.selectionStyle = UITableViewCellSelectionStyleNone;
 5
Author: iEinstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-10 09:44:26

Możesz użyć ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
 5
Author: Mak083,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-08 11:10:34
cell.selectionStyle = UITableViewCellSelectionStyleNone;
 5
Author: iDeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-01 06:21:50
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Szczęśliwego kodowania !!!
 5
Author: Rinku Sadhwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-24 06:39:05

Można to również zrobić z storyboardu. Kliknij komórkę widoku tabeli i w Inspektorze atrybutów pod komórką widoku tabeli Zmień listę rozwijaną obok zaznaczenia na brak.

 5
Author: Cindy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 05:12:56

Swift Solution w / Custom Cell:

import Foundation

class CustomTableViewCell: UITableViewCell
{
  required init(coder aDecoder: NSCoder)
  {
    fatalError("init(coder:) has not been implemented")
  }

  override init(style: UITableViewCellStyle, reuseIdentifier: String?)
  {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.selectionStyle = UITableViewCellSelectionStyle.None
  } 
}
 5
Author: Zorayr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 08:54:28

Możesz użyć selectionStyle właściwości UITableViewCell

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

Lub

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Również nie implementuj poniżej delegata

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Jeśli utworzyłeś plik Xib / Storyboard, możesz zmienić setUserInteractionEnabled właściwość tableview na No {[5] } przez odznaczenie jej. Spowoduje to, że widok tableview będzie tylko do odczytu.

 5
Author: Jayprakash Dubey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 08:55:20