2017-12-11 2 views
1

So habe ich eine MainTableView des Typs ExpyTableView (https://github.com/okhanokbay/ExpyTableView). Alles in Ordnung, ich habe es implementiert und es funktioniert, aber wie es im gif unten zu sehen ist, muss ich +1 zusätzliche Aktion für DidSelect und DidDeselect machen.Erweitern Sie Tabellenansicht Zelle, wenn ausgewählt und kompakt, wenn nicht ausgewählt Swift 3

demo gif

Die Sache ist, ich will, wenn sie mit der grünen Farbe markieren ausgewählt und sofort die anderen Zeilen zu erweitern, und wenn auf sie direkt nach abzuwählen und machen Sie die Zeile wieder normal angeklickt. Normalerweise muss dies nur nach 2 Tippen auf dem Bildschirm geschehen ... stattdessen mache ich 4, wie im gif zu sehen ist.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    //MARK : Print 
    print("Selected Section \(indexPath.section), Row : \(indexPath.row)") 
    /////////////// 

    if let cell = tableView.cellForRow(at: indexPath) { 
     if (indexPath.section == 1) || (indexPath.section == 2) || (indexPath.section == 3) { 
     cell.layer.borderWidth = 2.0 
     cell.layer.borderColor = Theme.defaultColor().cgColor 
     cell.layer.shadowOffset = CGSize.init(width: 0.5, height: 0.5) 
     } 
    } 
} 

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 
    if let cell = tableView.cellForRow(at: indexPath) { 
     tableView.deselectRow(at: indexPath, animated: false) 
     cell.layer.borderWidth = 0.1 
     cell.layer.borderColor = UIColor.lightGray.cgColor 

    } 
} 

Wo bin ich falsch gelaufen? THANKS

+0

Hallo, und was ist das Problem? Bitte aktualisieren Sie die Beschreibung mit genauem Problem und erwartetem Ergebnis. Ich denke, es ist, dass die Zelle markiert bleibt (nicht den gesamten Inhalt hervorhebt) und Lichter erst nach dem Abwählen, nicht wahr? So erwartete Ergebnis wäre: 1. Markieren Sie 2. Machen Sie die gesamte Zelle einschließlich der Erweiterung markiert? 3. Aufheben der Abwahl (Kollaps) Bin ich richtig? Wenn nicht, bitte aktualisieren Sie die Beschreibung. –

+0

Wie gesagt, wenn auf die Zeile geklickt wurde, um sie hervorzuheben und zu erweitern. Zum Abwählen klicken Sie erneut auf den Zeilenkontrakt und erhalten den Standard-Layer.border. Dies sollte mit nur 2 Hähnen gemacht werden. Stattdessen in meinem aktuellen Projekt ist dies in 4 Schritten gemacht, wie in der gif –

Antwort

0

Grundsätzlich hören Sie Tabellenänderungen für didDeselectRow, was bedeutet: Der Code wird ausgeführt, sobald die Tabellenansicht Zelle abgewählt ist. Sie können also diesen Code vergessen, wenn Sie ihn nicht wirklich benötigen. Aber was Sie getan haben ist, dass Sie die Zeile zweimal selects. Einmal zur Expansion, zum anderen zum Zusammenbruch.

Was Sie tun müssen, ist der Index der ausgewählten Zelle zu erinnern und es dann während id didSelectRowAt So eine Eigenschaft fileprivate var currentlySelectedCellIndexPath: IndexPath? und dann folgende in didSelectRowAt Verwendung erklären abzuwählen.

var currentlySelectedCellIndexPath: IndexPath? 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if let currentlySelectedCellIndexPath = currentlySelectedCellIndexPath { 
     // unselect the selected one 
     makeCellUnSelected(in: tableView, on: currentlySelectedCellIndexPath) 
     guard currentlySelectedCellIndexPath != indexPath else { 
      tableView.deselectRow(at: currentlySelectedCellIndexPath , animated: true) 
      self.currentlySelectedCellIndexPath = nil 
      return 
     } 
    } 

    // Highlight the proper cell 
    makeCellSelected(in: tableView, on: indexPath) 
    currentlySelectedCellIndexPath = indexPath 
} 

func makeCellSelected(in tableView: UITableView, on indexPath: IndexPath) { 
    if let cell = tableView.cellForRow(at: indexPath) { 
     if (indexPath.section == 1) || (indexPath.section == 2) || (indexPath.section == 3) { 
      cell.layer.borderWidth = 2.0 
      cell.layer.borderColor = Theme.defaultColor().cgColor 
      cell.layer.shadowOffset = CGSize.init(width: 0.5, height: 0.5) 
     } 
    } 
} 

func makeCellUnSelected(in tableView: UITableView, on indexPath: IndexPath) { 
    if let cell = tableView.cellForRow(at: indexPath) { 
     cell.layer.borderWidth = 0.1 
     cell.layer.borderColor = UIColor.lightGray.cgColor 
    } 
} 

Um zu erklären, was sie tut: Die Funktionen makeCellselected & makeCellUnselected nur die Stiländerungen gelten die Zelle markieren/hebt sie, wie Sie zuvor.

in der Funktion func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) nur nach aktuell sichtbaren und ausgewählten Zelle zu überprüfen. Wenn es sich um dieselbe Zelle handelt, reduzieren Sie sie in Guard und Return, da Sie nur expandieren/reduzieren müssen. Wenn es nicht dieselbe Zelle ist, dann verwerfen Sie die Auswahl einfach durch Aufruf von makeCellUnselected und wählen Sie die neue aus. Dies sollte Ihr Problem bisher lösen. Wenn Sie weitere Fragen haben, lassen Sie es mich wissen.

+0

Dank für die respons. Es gibt 2 Fehler: @ 1 - Lassen Sie currentSelectedCellIndexPath in Var ändern. und @ 2 - es sagt currentSelectedCellIndexPath = nil => Nil kann nicht zugewiesen werden, um 'IndexPath' einzugeben –

+0

@FagadariuMarcel Oh yeah, hab dich, ich habe 'self' im if let Abschnitt vergessen. Korrigiert. –

+0

tatsächlich funktioniert es sehr gut, aber ich musste self.mainTableView.allowsMultipleSelection = true kommentieren, um nur mit 1 TouchUpInside zu arbeiten. Die Sache ist, wenn ich möchte, dass ich alle 3 Reihen auswählen kann, jetzt bin ich bei nur 1 begrenzt. Irgendwelche Ideen? Trotzdem, danke, Alter. –

0

Was ich tun würde, ist eine Eigenschaft in Ihrem Modell isExpanded, die gespeichert wird, wenn die Zelle erweitert werden muss. Auf diese Weise können Sie es in heightForRowAtIndexPath verwenden, wo Sie das Element erhalten und die isExpanded Eigenschaft lesen.

Verwandte Themen