ios länge - Wie kann ich die Auswahl der UITableView-Auswahl deaktivieren?




meta title (25)

Wenn Sie in einer UITableView eine Zeile UITableView , wird die Zeile hervorgehoben und ausgewählt. Ist es möglich, dies zu deaktivieren, so dass das Antippen einer Zeile nichts bewirkt?


Answers

Sie müssen UITableViewCell den Auswahlstil für die UITableViewCell Instanz UITableViewCell indem Sie entweder:

Ziel c:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

oder

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Schnell 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Schnell 3:

cell.selectionStyle = .none

-tableView:didSelectRowAtIndexPath: Sie außerdem sicher, dass Sie -tableView:didSelectRowAtIndexPath: nicht implementieren -tableView:didSelectRowAtIndexPath: Delegieren Sie in Ihrer Tabellenansicht explizit die Zellen, für die Sie keine Aktion -tableView:didSelectRowAtIndexPath: möchten, wenn Sie sie implementieren.

Mehr Infos hier und here


Ab iOS 6.0 hat UITableViewDelegate tableView:shouldHighlightRowAtIndexPath: (Lesen Sie dazu in der iOS Documentation .)

Mit dieser Methode können Sie bestimmte Zeilen als nicht leuchtbar (und implizit nicht auswählbar) markieren, ohne den Auswahlstil einer Zelle ändern zu müssen, indem Sie die Ereignisbehandlung der Zelle mit userInteractionEnabled = NO oder anderen hier dokumentierten Techniken userInteractionEnabled = NO .


Sie können die selectionStyle- Eigenschaft von UITableViewCell verwenden

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

Oder

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Implementieren Sie auch nicht unterhalb von Delegaten

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

Wenn Sie eine Xib / Storyboard-Datei erstellt haben, können Sie die Eigenschaft setUserInteractionEnabled von tableview in No ändern, indem Sie sie deaktivieren . Dadurch wird Ihre Tabellenansicht schreibgeschützt.


Um die Hervorhebung der UItableviewcell zu deaktivieren

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

cell.userInteractionEnabled = NO;

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Fröhliche Codierung !!!


Ziel c:

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

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. Unter dem Snippet deaktivieren Sie alles auf der Zelle. Dadurch wird die Interaktion mit buttons , textfields deaktiviert:

    self.tableView.userInteractionEnabled = false;
    

Schnell:

Unten sind die Swift Äquivalente der obigen Objective-C Lösungen:

  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
    

Ich benutze das, was für mich funktioniert.

cell?.selectionStyle = UITableViewCellSelectionStyle.None

FESTGELEGTE LÖSUNG FÜR SWIFT 3

cell.selectionStyle = .none

Versuche dies

cell.selectionStyle = UITableViewCellSelectionStyleNone;

und

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

und Sie können den Auswahlstil auch mithilfe von interfacebuilder festlegen.


Sie können es auch vom Storyboard aus tun. Klicken Sie auf die Tabellenansichtszelle und ändern Sie im Attribute-Inspektor unter Tabellenansichtszelle die Dropdown-Liste neben Auswahl auf Keine.


Schnelle Lösung mit benutzerdefinierter Zelle:

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
  } 
}

Wenn die Auswahl nur blinken soll und nicht im ausgewählten Zustand bleiben soll, können Sie anrufen, in

didSelectRowAtIndexPath

folgende

[tableView deselectRowAtIndexPath:indexPath animated:YES];

So wird der ausgewählte Status blinken und zurück.


Sie können verwenden ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

So deaktivieren Sie die Auswahleigenschaft der Zelle: (Beim Tippen auf die Zelle).

cell.selectionStyle = UITableViewCellSelectionStyle.None

Für mich funktionierte folgendes:

tableView.allowsSelection = NO;

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

(Beachten Sie, dass diese Steuerelemente in den Zellen weiterhin UIButton oder andere Steuerelemente verwenden. Jegliche Steuerelemente in der Tabellenzelle stehen in keinem Zusammenhang mit der Möglichkeit von UITableView, eine Zeile auszuwählen "Verwenden von didSelectRowAt# .)


Zusammenfassend, was ich glaube, sind die richtigen Antworten basierend auf meiner eigenen Erfahrung bei der Umsetzung dieses:

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

cell.userInteractionEnabled = NO;

Das verhindert nicht nur die Auswahl, sondern stoppt auch die Tabellenansicht: didSelectRowAtIndexPath: Wird für die Zellen aufgerufen, für die sie festgelegt wurde. (Kredit geht an Tony Million für diese Antwort, danke!)

Wenn Sie in Ihren Zellen Schaltflächen haben, die angeklickt werden müssen, müssen Sie stattdessen:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Außerdem müssen Sie alle Klicks auf die Zelle in - (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!)


für schnelle Abwahl

cell.selectionStyle = .None

UITableViewCell der XIB Ihrer UITableViewCell im Attribute Inspector den Wert von Selection auf None .


Sie können die Hintergrundfarbe auch auf Clear setzen, um denselben Effekt wie UITableViewCellSelectionStyleNone zu erzielen, falls Sie UITableViewCellSelectionStyleNone nicht verwenden möchten / können.

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.


Sie können die Auswahl der Zeile auch vom Interface Builder aus deaktivieren, indem Sie NoSelection aus der selection (der UITableView-Eigenschaften) im Inspektorbereich auswählen, wie in der folgenden Abbildung dargestellt


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


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

1.Um die blaue Markierung zu deaktivieren, ohne irgendeine andere Interaktion der Zelle zu ändern:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Ich benutze dies, wenn ich eine UIButton - oder ein anderes Steuerelement - in einer UITableViewCell gehostet habe und ich möchte, dass der Benutzer mit den Steuerelementen interagieren kann, aber nicht mit der Zelle selbst.

HINWEIS : Wie oben erwähnt, verhindert Tony Million NICHT die Verwendung von tableView:didSelectRowAtIndexPath: Ich komme dazu mit einfachen "if" -Anweisungen, die meistens den Abschnitt testen und Aktionen für einen bestimmten Abschnitt vermeiden.

Eine andere Möglichkeit, wie ich das Zappeln einer Zelle testen könnte, 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 ganze Tabelle zu tun, können Sie die obige Lösung auf jede Zelle in der Tabelle anwenden, aber Sie können dies auch tun:

[tableView setAllowsSelection:NO];

In meinen Tests erlaubt dies weiterhin, dass Steuerelemente in der UITableViewCell interaktiv sind.


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

[cell setUserInteractionEnabled:NO];



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

[tableView setUserInteractionEnabled:NO];



5.Um zu bestimmen, ob eine Zelle markiert werden soll (was gemäß dieser Antwort implizit die Auswahl beinhaltet), können Sie die folgende UITableViewDelegate Protokollmethode implementieren:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

Falls jemand eine Antwort für Swift :

cell.selectionStyle = .None

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Wir können Code schreiben wie

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

aber wenn wir benutzerdefinierte Zelle xib über Linie haben , warnen Sie zu dieser Zeit für

benutzerdefinierte Zelle xib

Wir müssen den Auswahlstil None vom Interface Builder aus festlegen


Ich hatte etwas Glück, als ich ein einzelnes Stück der angenommenen Antwort implementierte (iOS 9+, Swift 2.2). Ich hatte versucht zu implementieren:

self.tableView.tableFooterView = UIView(frame: .zero)

Es gab jedoch keine Auswirkungen auf meine tableView - ich glaube, dass es etwas mit der Tatsache zu tun hat, dass ich UITableViewController .

Stattdessen musste ich nur die viewForFooterInSection Methode überschreiben (ich habe die tableFooterView anderswo festgelegt):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Dies funktionierte für ein tableView mit einem einzelnen Abschnitt (wenn Sie mehrere Abschnitte haben, müssen Sie den letzten Abschnitt angeben).





ios objective-c uitableview cocoa-touch highlight