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?
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?
Antworten:
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 UIButton
diese 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 UITableView
im Bearbeitungsmodus befindet. Verwenden Sie den folgenden Code, um die Zellenauswahl im Bearbeitungsmodus einzuschränken:
tableView.allowsSelectionDuringEditing = false
selectionStyle
Eigenschaft für die Zelle festlegen : cell.selectionStyle = UITableViewCellSelectionStyle.None
in Swift oder cell.selectionStyle = UITableViewCellSelectionStyleNone
in Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
, cell.selectionStyle = .None
ist 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 = false
ist die Einstellung in Ordnung.
Sie müssen lediglich den Auswahlstil für die UITableViewCell
Instanz 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
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 UITableViewCell
noch 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 UITableViewDelegate
Protokollmethode implementieren :
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:
, was im Allgemeinen (nicht immer) mein bevorzugter Ansatz ist.
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!)
Ab iOS 6.0 UITableViewDelegate
hat 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 = NO
oder andere hier dokumentierte Techniken zu beeinträchtigen.
Sie können auch die Auswahl der Zeile im Interface Builder selbst deaktivieren, indem Sie auswählen NoSelection
selection
im Inspektorfenster aus der Option (der UITableView-Eigenschaften) auswählen (siehe Abbildung unten)
FESTE LÖSUNG FÜR SWIFT 3
cell.selectionStyle = .none
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.
Falls jemand eine Antwort für Swift benötigt :
cell.selectionStyle = .None
Dies ist, was ich benutze, cellForRowAtIndexPath
um diesen Code zu schreiben:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Über das UITableViewDelegate
Protokoll 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 willDeselectRowAtIndexPath
Methode verwenden und return nil
wenn Sie nicht möchten, dass die Auswahl der Zeile aufgehoben wird.
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 delegate
oder 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
}
Unterhalb des Snippets wird die Hervorhebung deaktiviert, aber auch der Aufruf von deaktiviert didSelectRowAtIndexPath
. Wenn Sie also nicht implementieren, didSelectRowAtIndexPath
verwenden Sie die folgende Methode. Dies sollte hinzugefügt werden, wenn Sie die Tabelle erstellen. Dies funktioniert jedoch auf Schaltflächen und UITextField
in der Zelle.
self.tableView.allowsSelection = NO;
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;
Deaktivieren Sie unter dem Snippet alles in der Zelle. Dadurch wird die Interaktion zu deaktiviertbuttons
, textfields
:
self.tableView.userInteractionEnabled = false;
Nachfolgend sind die Swift
oben genannten Objective-C
Lösungen aufgeführt:
Ersatz der ersten Lösung
self.tableView.allowsSelection = false
Ersatz der zweiten Lösung
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Ersatz der dritten Lösung
self.tableView.userInteractionEnabled = false
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)
}
Ich habe auch ziemlich heftig damit gekämpft und eine Kontrolle in meinem UITableViewCell
verbotenen Gebrauch von userInteractionEnabled
Eigentum 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:
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
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
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
Ich benutze dies, was für mich funktioniert.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
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];
...
}
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 .
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.
cell.selectionStyle = UITableViewCellSelectionStyle.none
in Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Viel Spaß beim Codieren !!!
selection
und wird damit natürlichhighlighting
deaktiviert. Viele Antworten mit hohen Stimmen erklären, wiedisable selection
das Deaktivieren behoben werden kann und nichthighlighting
. Um nur das Hervorheben zu deaktivieren, verwenden Siecell.selectionStyle = .None
oder gehen Sie zustoryboard / cell / Selection = None