Wie kann ich die UITableView-Auswahl deaktivieren?

1192

Wenn Sie auf eine Zeile in a tippen UITableView, wird die Zeile hervorgehoben und ausgewählt. Ist es möglich, dies zu deaktivieren, sodass das Tippen auf eine Zeile nichts bewirkt?

DavidM
quelle
17
Die ursprüngliche Frage hat einen schlechten Titel. OP möchte in erster Linie deaktivieren selectionund wird damit natürlich highlightingdeaktiviert. Viele Antworten mit hohen Stimmen erklären, wie disable selectiondas Deaktivieren behoben werden kann und nicht highlighting. Um nur das Hervorheben zu deaktivieren, verwenden Sie cell.selectionStyle = .Noneoder gehen Sie zustoryboard / cell / Selection = None
Andrej
Bitte aktualisieren Sie entweder den Titel oder den Beitrag. Ich bin verwirrt. Und aufgrund dieser Frage habe ich keine Ahnung, was die Antworten bewirken sollen.
Daniel Springer

Antworten:

603

Für mich hat Folgendes gut funktioniert:

tableView.allowsSelection = false

Das heißt didSelectRowAt#einfach nicht funktionieren. Das heißt, das Berühren einer Reihe des Tisches als solches wird absolut nichts bewirken. (Und daher wird es natürlich nie eine ausgewählte Animation geben.)

(Beachten Sie, dass UIButtondiese Steuerelemente in den Zellen oder anderen Steuerelementen natürlich weiterhin funktionieren. Alle Steuerelemente, die Sie zufällig in der Tabellenzelle haben, stehen in keinem Zusammenhang mit der Fähigkeit von UITableView, "eine Zeile auszuwählen". mit didSelectRowAt#.)

Ein weiterer zu beachtender Punkt ist: Dies funktioniert nicht, wenn sich das UITableViewim Bearbeitungsmodus befindet. Verwenden Sie den folgenden Code, um die Zellenauswahl im Bearbeitungsmodus einzuschränken:

tableView.allowsSelectionDuringEditing = false 
Let's_Create
quelle
6
Dies funktionierte schließlich für mich. Ich habe versucht, cell.selectionStyle = UITableViewCellSelectionStyleNone zu verwenden. aber es hat nicht funktioniert. Eine Sache zu beachten: Es sollte sein: tableView.allowsSelection = NO; nicht falsch.
Tony.tc.leung
6
Ich denke, das ist die beste Option. Schaltflächen in Zellen sind damit aktiv, aber Text ist nicht aktiv.
Fahim Parkar
513
Wie ist das die akzeptierte Antwort und hat so viele Stimmen? Es beantwortet die Frage überhaupt nicht! Sie müssen die selectionStyleEigenschaft für die Zelle festlegen : cell.selectionStyle = UITableViewCellSelectionStyle.Nonein Swift oder cell.selectionStyle = UITableViewCellSelectionStyleNonein Objective-C.
Nodebase
5
Dies funktioniert für mich in schnell 2.tableView.allowSelection = false
Khanad
15
Es gibt verschiedene Möglichkeiten, dies zu tun, je nachdem, was gewünscht wird. Kein Auswahlstil und keine Auswahl können beide funktionieren oder beide können fehlschlagen. Hier ist ein Beispiel. Wenn Sie die Zelle auswählen und die aufzurufen möchten tableViewDidSelectRowAtIndexPath, cell.selectionStyle = .Noneist dies erwünscht. Wenn Sie nicht möchten oder möchten, dass diese Delegatenfunktion aufgerufen wird (dh ein Textfeld in einer tableViewCell hat), tableView.allowsSelection = falseist die Einstellung in Ordnung.
Made2k
1963

Sie müssen lediglich den Auswahlstil für die UITableViewCellInstanz wie folgt festlegen :

Ziel c:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

oder

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 und 4.x:

cell.selectionStyle = .none

Stellen Sie außerdem sicher, dass Sie entweder keinen -tableView:didSelectRowAtIndexPath:Delegaten in Ihrer Tabellenansicht implementieren oder die Zellen, für die Sie keine Aktion ausführen möchten, explizit ausschließen, wenn Sie dies implementieren.

Mehr Infos hier und hier

Martin Gordon
quelle
122
@ Tony Es ist eine schlechte Idee, wenn Sie ein UITextField in der Zelle haben.
Aniruddh Joshi
73
@TonyMillion Es ist auch eine schlechte Idee, wenn Sie integrierte Bearbeitungssteuerelemente verwenden möchten, z. B. Wischen zum Löschen. Wenn Sie userInteractionEnabled auf NO setzen, reagiert die Schaltfläche Löschen nicht auf Benutzerberührungsereignisse.
Carlos P
47
Spät zu diesem Thread, aber anstelle von userInteraction verwenden Sie cell.allowsSelection. Das stoppt die Interaktionsmethoden der Zelle, blockiert aber nicht das reguläre UIView-Responder-Zeug.
Chris C
4
Wenn Sie cell.userInteractionEnable = No festlegen, wird das Auslösen eines didSelectRowAtIndexPath nicht beendet.
user4951
25
Ich werde die Antwort abstimmen, aber um klar zu sein, hat das OP nur darum gebeten, das "Hervorheben" zu deaktivieren, nein, um die gesamte Zellinteraktion zu deaktivieren, daher sind alle diese Kommentare offtopisch.
Frederic Yesid Peña Sánchez
353

Da ich diesen Beitrag kürzlich gelesen habe und er mir geholfen hat, wollte ich eine weitere Antwort veröffentlichen, um alle Antworten (für die Nachwelt) zu konsolidieren.



Es gibt also tatsächlich 5 verschiedene Antworten, abhängig von Ihrer gewünschten Logik und / oder Ihrem gewünschten Ergebnis:

1.So deaktivieren Sie die blaue Hervorhebung, ohne eine andere Interaktion der Zelle zu ändern:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Ich verwende dies, wenn ein UIButton oder ein anderes Steuerelement in einer UITableViewCell gehostet wird und ich möchte, dass der Benutzer mit den Steuerelementen interagieren kann, nicht jedoch mit der Zelle selbst.

HINWEIS : Wie Tony Million oben erwähnt hat, verhindert dies NICHTtableView:didSelectRowAtIndexPath:. Ich umgehe dies durch einfache "if" -Anweisungen, die meistens auf den Abschnitt testen und Aktionen für einen bestimmten Abschnitt vermeiden.

Eine andere Möglichkeit, das Abhören einer solchen Zelle zu testen, ist:

- (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. Um dies für eine gesamte Tabelle zu tun, können Sie die obige Lösung auf jede Zelle in der Tabelle anwenden, aber Sie können auch Folgendes tun:

[tableView setAllowsSelection:NO];

In meinen Tests können Steuerelemente im Inneren immer UITableViewCellnoch interaktiv sein.


3.Um eine Zelle "schreibgeschützt" zu machen, können Sie einfach Folgendes tun:

[cell setUserInteractionEnabled:NO];



4.Um eine ganze Tabelle "schreibgeschützt" zu machen

[tableView setUserInteractionEnabled:NO];



5. Um im laufenden Betrieb zu bestimmen, ob eine Zelle hervorgehoben werden soll (was gemäß dieser Antwort implizit die Auswahl umfasst), können Sie die folgende UITableViewDelegateProtokollmethode implementieren :

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
mbm29414
quelle
3
Wenn Sie das Zellendesign von einer Schreibfeder laden, funktioniert das Kontrollkästchen (in IB) für # 3 (und für Tabellen für # 4) einwandfrei. Ist der Unterschied zwischen # 4 und # 2, ob die Steuerelemente in der Zelle interaktiv sind oder nicht?
Lilbyrdie
4
Ja. Wenn Sie die Auswahl deaktivieren möchten, aber UIButtons usw. weiterhin die Benutzerinteraktion unterstützen möchten, verwenden Sie # 2. Wenn Sie eine vollständig schreibgeschützte Zelle wünschen, verwenden Sie # 4. Warum Sie etwas anderes als UIViews oder UILabels in einer nicht interaktiven Zelle haben würden, ist mir natürlich ein Rätsel. Vielleicht möchte jemand alle Interaktionen deaktivieren, während etwas anderes passiert.
mbm29414
8
# 4 ist eine schreckliche Idee, dies wird auch das Scrollen in der Tabellenansicht deaktivieren
Simon
4
@simon Eigentlich ist es keine schreckliche Idee; Dies ist eine Option, die je nach Ihren Umständen eine gute Option sein kann oder nicht. Außerdem deaktiviert # 4 das Scrollen von USER. Bei Bedarf können Sie auch Ihre eigenen implementieren. Ich bin damit einverstanden, dass # 4 nicht VIEL nützlich ist, aber es ist keine schreckliche Idee.
mbm29414
3
Der Vollständigkeit halber könnten Sie bitte einen Shout-Out hinzufügen tableView:shouldHighlightRowAtIndexPath:, was im Allgemeinen (nicht immer) mein bevorzugter Ansatz ist.
Benjohn
82

Um zusammenzufassen, was meiner Meinung nach die richtigen Antworten sind, basierend auf meiner eigenen Erfahrung bei der Umsetzung:

Wenn Sie die Auswahl nur für einige der Zellen deaktivieren möchten, verwenden Sie:

cell.userInteractionEnabled = NO;

Dies verhindert nicht nur die Auswahl, sondern verhindert auch, dass tableView: didSelectRowAtIndexPath: für die Zellen aufgerufen wird, für die es festgelegt wurde. (Dank geht an Tony Million für diese Antwort, danke!)

Wenn Ihre Zellen Schaltflächen enthalten, auf die geklickt werden muss, müssen Sie stattdessen:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Außerdem müssen Sie alle Klicks auf die Zelle in ignorieren - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

Wenn Sie die Auswahl für die gesamte Tabelle deaktivieren möchten, verwenden Sie:

tableView.allowsSelection = NO;

(Dank an Paulo De Barros, danke!)

JosephH
quelle
Was ist, wenn wir einen Knopf in unserer Zelle haben?
Umair Afzal
56

Ab iOS 6.0 UITableViewDelegatehat tableView:shouldHighlightRowAtIndexPath:. (Lesen Sie darüber in der iOS- Dokumentation .)

Mit dieser Methode können Sie bestimmte Zeilen als nicht hervorhebbar (und implizit nicht auswählbar) markieren, ohne den Auswahlstil einer Zelle ändern zu müssen, die Ereignisbehandlung der Zelle userInteractionEnabled = NOoder andere hier dokumentierte Techniken zu beeinträchtigen.

cbowns
quelle
2
Stolperte über diesen Thread und ich war schockiert, so viele andere Antworten vor dieser zu sehen. Dies ist ohne Zweifel der richtige Weg.
Beebcon
2
Dies ist in der Tat die richtige und einzige Antwort, die berücksichtigt werden sollte. Alles andere, was userInteraction erwähnt, ist völlig falsch.
Mattyohe
50

Sie können auch die Auswahl der Zeile im Interface Builder selbst deaktivieren, indem Sie auswählen NoSelectionselection im Inspektorfenster aus der Option (der UITableView-Eigenschaften) auswählen (siehe Abbildung unten)

UITableView Inspector

Vignesh Kumar
quelle
2
Beste Lösung IMHO
Itai Spector
Ich benutze oft diese Lösung
Evsenev
46

FESTE LÖSUNG FÜR SWIFT 3

cell.selectionStyle = .none
MANISH PATHAK
quelle
36

In Ihrem UITableViewCell‚s XIB in Attribut - Inspektoren Sollwert Selectionan None.

Geben Sie hier die Bildbeschreibung ein

Zaid Pathan
quelle
Genau das brauchte ich. Ich wollte immer noch die Benachrichtigung didSelect ..., aber ohne den sichtbaren Hinweis auf die Auswahl. Vielen Dank!
Timothy Tripp
Ich bin froh, dass es geholfen hat! :)
Zaid Pathan
35

Wenn Sie möchten, dass die Auswahl nur blinkt und nicht im ausgewählten Status bleibt, können Sie anrufen

didSelectRowAtIndexPath

folgende

[tableView deselectRowAtIndexPath:indexPath animated:YES];

so blinkt der ausgewählte Zustand und kehrt zurück.

Chris Fox
quelle
3
Bei diesem Ansatz wird die Zeile sofort hervorgehoben und über eine halbe Sekunde ausgeblendet. So gestaltet Apple seine Einstellungsmenüs, sodass es für mich gut aussieht.
VinceFior
34

Falls jemand eine Antwort für Swift benötigt :

cell.selectionStyle = .None
Aks
quelle
1
Wir können auch diese cell.selectionStyle = UITableViewCellSelectionStyle.None
wahrscheinlich
29

Dies ist, was ich benutze, cellForRowAtIndexPathum diesen Code zu schreiben:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ahsan Ebrahim
quelle
28

Über das UITableViewDelegateProtokoll können Sie die Methode willSelectRowAtIndexPath und verwendenreturn nil wenn Sie nicht möchten, dass die Zeile ausgewählt wird.

Auf die gleiche Weise können Sie die willDeselectRowAtIndexPathMethode verwenden und return nilwenn Sie nicht möchten, dass die Auswahl der Zeile aufgehoben wird.

user41806
quelle
5
Ich mag diese Methode nicht, weil sie die Zelle bis zum Ausbessern immer noch im hervorgehobenen Zustand zeigt.
Kbanman
2
Genau deshalb gefällt es mir :-)
Joris Weimar
24

1- Alles, was Sie tun müssen, ist den Auswahlstil für dieUITableViewCell Instanz wie folgt festzulegen:


Ziel c:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

oder

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None


Swift 3:

cell.selectionStyle = .none


2 - Nicht implementieren - tableView:didSelectRowAtIndexPath:in Ihrer Tabellenansicht delegateoder schließen Sie explizit die Zellen aus, für die Sie keine Aktion ausführen möchten, wenn Sie sie implementieren.

3 - Außerdem können Sie dies auch über das Storyboard tun. Klicken Sie auf die Tabellenansichtszelle und ändern Sie im Attributinspektor unter Tabellenansichtszelle die Dropdown-Liste neben Auswahl in Keine.


4 - Sie können die Hervorhebung von Tabellenzellen mit dem folgenden Code in (iOS) Xcode 9, Swift 4.0 deaktivieren

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}
parvind
quelle
20

Ziel c:

  1. Unterhalb des Snippets wird die Hervorhebung deaktiviert, aber auch der Aufruf von deaktiviert didSelectRowAtIndexPath. Wenn Sie also nicht implementieren, didSelectRowAtIndexPathverwenden Sie die folgende Methode. Dies sollte hinzugefügt werden, wenn Sie die Tabelle erstellen. Dies funktioniert jedoch auf Schaltflächen und UITextFieldin der Zelle.

    self.tableView.allowsSelection = NO;
  2. Unterhalb des Snippets wird die Hervorhebung deaktiviert und der Aufruf von wird nicht deaktiviert didSelectRowAtIndexPath. Setzen Sie den Auswahlstil der Zelle auf Keine incellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. Deaktivieren Sie unter dem Snippet alles in der Zelle. Dadurch wird die Interaktion zu deaktiviertbuttons , textfields:

    self.tableView.userInteractionEnabled = false;

Schnell:

Nachfolgend sind die Swiftoben genannten Objective-CLösungen aufgeführt:

  1. Ersatz der ersten Lösung

    self.tableView.allowsSelection = false
  2. Ersatz der zweiten Lösung

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. Ersatz der dritten Lösung

    self.tableView.userInteractionEnabled = false
Arun Gupta
quelle
19

Versuchen Sie Folgendes einzugeben:

cell.selected = NO;

Bei Bedarf wird die Auswahl Ihrer Zeile aufgehoben.

In 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
quelle
14

Ich habe auch ziemlich heftig damit gekämpft und eine Kontrolle in meinem UITableViewCellverbotenen Gebrauch von userInteractionEnabledEigentum gehabt . Ich habe eine statische Tabelle mit 3 Zellen für Einstellungen, 2 mit Datumsangaben, 1 mit einem Ein / Aus-Schalter. Nachdem ich in Storyboard / IB herumgespielt habe, habe ich es geschafft, die untere nicht auswählbar zu machen, aber wenn Sie darauf tippen, verschwindet die Auswahl aus einer der oberen Reihen. Hier ist ein WIP-Bild meiner Einstellungen UITableView:

Einstellungen UITableView

Wenn Sie auf die 3. Zeile tippen, passiert überhaupt nichts. Die Auswahl bleibt in der zweiten Zeile. Die Funktionalität ist praktisch eine Kopie des Bildschirms zur Auswahl der Ereigniszeit für die Kalender-App von Apple.

Der Code ist überraschend kompatibel bis hinunter zu IOS2 = /:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

Dies funktioniert in Verbindung mit dem Festlegen des Auswahlstils auf "Keine", damit die Zelle bei Touchdown-Ereignissen nicht flackert

Yarek T.
quelle
11

Wir können Code wie schreiben

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

aber wenn wir benutzerdefinierte Zelle xib über der Zeile haben, geben Sie eine Warnung zu diesem Zeitpunkt für

benutzerdefinierte Zelle xib

Wir müssen den Auswahlstil "Keine" im Interface Builder festlegen

iDhaval
quelle
11

Sie müssen diesen Code nur in cellForRowAtIndexPath einfügen

So deaktivieren Sie die Auswahleigenschaft der Zelle: (Während Sie auf die Zelle tippen).

cell.selectionStyle = UITableViewCellSelectionStyle.None
Gaurav Patel
quelle
Danke, ich habe ein Bild in meiner Zelle und ein Etikett darüber. Ich habe den Etikettenhintergrund festgelegt, aber jedes Mal, wenn ich auf den Hintergrund klicke, verschwindet er. Dies hat das Problem behoben.
Darko
10

Versuche dies

cell.selectionStyle = UITableViewCellSelectionStyleNone;

und

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Sie können den Auswahlstil auch mit dem Interfacebuilder festlegen.

v_1
quelle
10

Ich benutze dies, was für mich funktioniert.

cell?.selectionStyle = UITableViewCellSelectionStyle.None
Priyanka Gautam
quelle
7

Dies ist zwar die beste und einfachste Lösung, um zu verhindern, dass eine Zeile während der Auswahl die Hervorhebung anzeigt

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Ich möchte auch vorschlagen, dass es gelegentlich nützlich ist, kurz zu zeigen, dass die Zeile ausgewählt wurde, und sie dann auszuschalten. Dies warnt die Benutzer mit einer Bestätigung dessen, was sie auswählen wollten:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Steve Barden
quelle
7

Deaktivieren Sie das Hervorheben von TableViewCell im Storyboard direkt

Geben Sie hier die Bildbeschreibung ein

Kamani Jasmin
quelle
6

Deaktivieren der Hervorhebung der UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Und sollte dem Benutzer nicht erlauben, mit der Zelle zu interagieren.

cell.userInteractionEnabled = NO;
Sharme
quelle
6

Sie können die Hintergrundfarbe auch auf Löschen einstellen, um den gleichen Effekt zu erzielen UITableViewCellSelectionStyleNone, falls Sie ihn nicht verwenden möchten / können UITableViewCellSelectionStyleNone.

Sie würden Code wie den folgenden verwenden:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

Dies kann Ihre Leistung beeinträchtigen, da Sie jeder Zelle eine zusätzliche farbige Ansicht hinzufügen .

virindh
quelle
6

Sie können verwenden:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

in der Zelle für Zeile am Indexpfad Ihrer UITableView.

Sie können auch verwenden:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

in der Tabellenansicht didselectrowatindexpath method.

Annu
quelle
Es ist jetzt cell.selectionStyle = UITableViewCellSelectionStyle.nonein Swift 3.
Dan
5

Sie können dies verwenden

cell.selectionStyle = UITableViewCellSelectionStyleNone;
iEinstein
quelle
5

Sie können verwenden ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Mak083
quelle
5
cell.selectionStyle = UITableViewCellSelectionStyleNone;
iDeveloper
quelle
5
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Viel Spaß beim Codieren !!!

Rinku Sadhwani
quelle
5

Sie können dies auch über das Storyboard tun. Klicken Sie auf die Tabellenansichtszelle und ändern Sie im Attributinspektor unter Tabellenansichtszelle die Dropdown-Liste neben Auswahl in Keine.

Cindy
quelle