Antworten:
In Ihrem müssen didSelectRowAtIndexPath
Sie anrufen, deselectRowAtIndexPath
um die Auswahl der Zelle aufzuheben.
Was auch immer Sie sonst noch tun, didSelectRowAtIndexPath
Sie müssen es auch anrufen deselectRowAtIndexPath
.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Do some stuff when the row is selected
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
-deselectRowAtIndexPath:animated:
Methode für seine tableView-Eigenschaft von auf -viewDidAppear
. Wenn Sie jedoch eine Tabellenansicht in einer UIViewController-Unterklasse haben, sollten Sie -deselectRowAtIndexPath:animated:
von -viewDidAppear
sich aus aufrufen . :)
-viewWillAppear:
, die es kaputt machte. Hinzufügen eines Anrufs, damit [super viewWillAppear:animated]
es wieder funktioniert.
UITableViewController
‚s - clearsSelectionOnViewWillAppear
Eigenschaft auf YES
(das ist die Standardeinstellung), und Sie haben nicht verhindert [super viewWillAppear]
davor genannt.
Der sauberste Weg, dies zu tun, ist auf viewWillAppear:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// Unselect the selected row if any
NSIndexPath* selection = [self.tableView indexPathForSelectedRow];
if (selection) {
[self.tableView deselectRowAtIndexPath:selection animated:YES];
}
}
Auf diese Weise haben Sie die Animation, die Auswahl auszublenden, wenn Sie zum Controller zurückkehren, wie es sein sollte.
Entnommen aus http://forums.macrumors.com/showthread.php?t=577677
Schnelle Version
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// deselect the selected row if any
let selectedRow: IndexPath? = tableView.indexPathForSelectedRow
if let selectedRowNotNill = selectedRow {
tableView.deselectRow(at: selectedRowNotNill, animated: true)
}
}
viewDidAppear
stattdessen einfach auf .
indexPathForSelectedRow
Anruf kann null zurückgeben, daher sollte geprüft werden, ob . In der Dokumentation heißt es : Ein Indexpfad, der die Zeilen- und Abschnittsindizes der ausgewählten Zeile identifiziert, oder Null, wenn der Indexpfad ungültig ist.
Hast du eine Unterklasse -(void)viewWillAppear:(BOOL)animated
? Die ausgewählte UITableViewCell wird nicht abgewählt, wenn Sie [super viewWillAppear:animated];
Ihre benutzerdefinierte Methode nicht aufrufen .
Fügen Sie für die Swift-Benutzer Folgendes zu Ihrem Code hinzu:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
Es ist Paulthenerds Antwort, außer in Swift anstelle von Obj-C.
Aktualisiert mit Swift 4
Nach einigen Experimenten, auch basierend auf früheren Antworten, bin ich zu dem Schluss gekommen, dass das beste Verhalten auf zwei Arten erreicht werden kann: (in der Praxis fast identisch)
// First Solution: delegate of the table View
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: false)
}
// Second Solution: With the life cycle of the view.
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
let selectedRow: IndexPath? = tableView.indexPathForSelectedRow
if let selectedRow = selectedRow {
tableView.deselectRow(at: selectedRow, animated: false)
}
}
Ich persönlich nehme die erste Lösung an, weil sie einfach prägnanter ist. Eine andere Möglichkeit, wenn Sie bei der Rückkehr zu tableView eine kleine Animation benötigen, ist folgende viewWillAppear
:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let selectedRow: IndexPath? = _view.tableView.indexPathForSelectedRow
if let selectedRow = selectedRow {
_view.tableView.deselectRow(at: selectedRow, animated: true)
}
}
Wenn Sie einen UITableViewController verwenden, können Sie auch die Eigenschaft clearsSelectionOnViewWillAppear nutzen .
Um das Verhalten zu erhalten, das Kendall Helmstetter Gelner in seinem Kommentar beschreibt, möchten Sie wahrscheinlich nicht deselectRowAtIndexPath, sondern die Eigenschaft clearsSelectionOnViewWillAppear auf Ihrem Controller. Vielleicht wurde dies versehentlich auf JA gesetzt?
Weitere Informationen zu neuen UITableViewController-Unterklassen finden Sie im Kommentar in der Standardvorlage von Apple:
- (void)viewDidLoad
{
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
}
Ich bekam dieses Problem auch für meine Drilldown-Anwendung. Nachdem ein Viewcontroller, den ich VC nennen werde, nach dem Drücken eines anderen ViewControllers zurückkehrt, bleibt die ausgewählte Zelle in VC hervorgehoben. In meiner App hatte ich VC erstellt, um die zweite Ebene (von drei Ebenen) meines Drilldowns zu verwalten.
Das Problem in meinem Fall ist, dass VC ein UIViewController war (der eine Ansicht enthielt, die eine TableView enthielt). Ich habe VC stattdessen zu einem UITableViewController gemacht (der eine TableView enthielt). Die UITableViewController-Klasse übernimmt automatisch die Deaktivierung der Tabellenzelle, nachdem sie von einem Push zurückgekehrt ist. Die zweite Antwort auf den Beitrag " Problem mit deselectRowAtIndexPath in tableView " gibt eine vollständigere Antwort auf dieses Problem.
Das Problem trat beim Root-Viewcontroller nicht auf, da beim Erstellen der App als "navigationsbasierte App" in XCode der resultierende Root-Viewcontroller bereits in die Unterklasse UITableViewController versetzt wurde.
Wenn nichts davon für Sie funktioniert, ziehen Sie diese Problemumgehung in Betracht:
Verwenden Sie einen Abwicklungsabschnitt, um Folgendes aufzurufen:
@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
if let index = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(index, animated: true)
}
}
Warum das? In erster Linie, wenn Sie Probleme haben, den Code zur Abwahl zum richtigen Zeitpunkt auszuführen. Ich hatte Probleme damit, nicht mit viewWillAppear zu arbeiten, daher funktionierte das Abwickeln viel besser.
Schritte:
Schreiben Sie den Abwicklungsabschnitt (oder fügen Sie ihn von oben ein) in Ihre 1. VC (die mit der Tabelle).
Gehe zum 2. VC. Ziehen Sie bei gedrückter Ctrl-Taste von der Schaltfläche Abbrechen / Fertig / usw., die Sie verwenden, um diese VC zu schließen, und ziehen Sie sie zum Beenden-Symbol oben.
Wählen Sie den in Schritt 1 erstellten Abwicklungsbereich aus
Viel Glück.
Ich verwende CoreData, daher war der Code, der für mich funktioniert hat, eine Kombination von Ideen aus verschiedenen Antworten in Swift:
override func viewDidAppear(_ animated: Bool) {
if let testSelected = yourTable.indexPathForSelectedRow {
yourTable.deselectRow(at: testSelected, animated: true)
}
super.viewDidAppear(true)
}
Ich habe seit langer Zeit das gleiche Problem, falls jemand anderes Probleme hat:
-tableView: cellForRowAtIndexPath:
Sehen Sie sich Ihre an und prüfen Sie, ob Sie Zellen erstellen oder eine 'Wiederverwendungskennung' verwenden. Stellen Sie in letzterem Fall sicher, dass Ihre Tabelle in IB eine Zelle mit dieser Kennung enthält. Wenn Sie keinen Wiederverwendungsbezeichner verwenden, erstellen Sie einfach eine neue Zelle für jede Zeile.
Dies sollte Ihrer Tabelle dann die erwartete "Ausblenden ausgewählte Zeile" beim Erscheinen geben.
Für Swift 3: Ich würde es vorziehen, es in viewDidDisappear zu verwenden
Definieren:-
var selectedIndexPath = IndexPath()
In viewDidDisappear: -
override func viewDidDisappear(_ animated: Bool) {
yourTableView.deselectRow(at: selectedIndexPath, animated: true)
}
In didSelectRowAtIndexPath: -
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
selectedIndexPath = indexPath
}
Wenn die Zelle nach dem Berühren hervorgehoben bleibt, können Sie die UITabelView-Methode aufrufen.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
`[tableView deselectRowAtIndexPath:indexPath animated:YES];`
}
Oder Sie können die folgende Methode verwenden und sie gemäß Ihren Anforderungen ändern:
// MARK: UITableViewDelegate
func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
cell.backgroundColor = UIColor.greenColor()
}
}
func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
cell.backgroundColor = UIColor.blackColor()
}
}
Xcode 10, Swift 4
Ich hatte das gleiche Problem und stellte fest, dass ich einen leeren Aufruf von viewWillAppear am unteren Rand meines tableViewController hinterlassen habe. Nachdem ich die leere Überschreibungsfunktion entfernt hatte, blieb die Zeile bei der Rückkehr zur tableView-Ansicht nicht mehr hervorgehoben.
Problem func
override func viewWillAppear(_ animated: Bool) {
// need to remove this function if not being used.
}
Das Entfernen der leeren Funktion löste mein Problem.
deselectRowAtIndexPath
in meiner viewDidAppear aufzurufen, wenn die Auswahl der Zeile eine neue Ansicht aufruft.