2015-08-04 8 views
10

Ich versuche, eine Tabellenansichtszelle zu erweitern, wenn Sie darauf tippen. Wenn es erneut angezapft wird, möchte ich, dass es in seinen ursprünglichen Zustand zurückkehrt.Erweitern und verengen Sie die Tabellenansichtszelle, wenn Sie darauf tippen, in swift

Wenn cellA erweitert wird und cellB angezapft wird, möchte ich cellA zusammenziehen und cellB zur gleichen Zeit erweitern. Damit kann zu jedem Zeitpunkt nur eine Zelle in ihrem expandierten Zustand sein.

Mein aktueller Code:

class MasterViewController: UITableViewController { 
    var isCellTapped = false 
    var currentRow = -1 


    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     selectedRowIndex = indexPath 
     tableView.beginUpdates() 
     tableView.endUpdates() 
    } 


    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

    if indexPath.row == selectedRowIndex.row { 
     if isCellTapped == false { 
      isCellTapped = true 
      return 140 
     } else if isCellTapped == true { 
      isCellTapped = false 
      return 70 
     } 

    } 

    return 70 
} 

Aktuelle Code funktioniert gut, wenn:

  • Sie eine Zeile tippen (es erweitert)
  • Sie es tippen Sie erneut (kontrahiert)

Es schlägt fehl, wenn:

  • Sie tippen, um eine Reihe (es erweitert)
  • Sie tippen eine weitere Zeile (es Verträge, aber die andere Reihe sich nicht ausdehnt)

Wie kann ich dieses Problem lösen?

+0

Was möchten Sie erreichen? Ein Akkordeonmenü (Dropdown-Menü) mit einem 'UITableView'? –

+0

Ja @VictorSigler, so etwas. Denkst du, dass mit UITableView getan werden kann? Oder gibt es andere Klassen, die besser zu dieser Aufgabe passen? –

+0

Ja, Sie können @Diego meine Antwort sehen. –

Antwort

17

Sie müssen in Betracht ziehen, die Sie benötigen, um Ihre ausgewählten Zeile zu aktualisieren, wenn ein anderer abgegriffen wird, siehe den folgenden Code:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

    if indexPath.row == selectedRowIndex { 
     return 140 
    } 
    return 44 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    if selectedRowIndex != indexPath.row { 

     // paint the last cell tapped to white again 
     self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: self.selectedRowIndex, inSection: 0))?.backgroundColor = UIColor.whiteColor() 

     // save the selected index 
     self.selectedRowIndex = indexPath.row 

     // paint the selected cell to gray 
     self.tableView.cellForRowAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor() 

     // update the height for all the cells 
     self.tableView.beginUpdates() 
     self.tableView.endUpdates() 
    } 
} 

EDIT:

zu behandeln, die Zelle, in der ausgewählt ist und erneut angetippt wird, um in den ursprünglichen Zustand zurückzukehren, müssen Sie einige Bedingungen wie die folgenden überprüfen:

var thereIsCellTapped = false 
var selectedRowIndex = -1 

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

    if indexPath.row == selectedRowIndex && thereIsCellTapped { 
     return 140 
    } 

    return 44 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    self.tableView.cellForRowAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor() 

    // avoid paint the cell is the index is outside the bounds 
    if self.selectedRowIndex != -1 { 
     self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: self.selectedRowIndex, inSection: 0))?.backgroundColor = UIColor.whiteColor() 
    } 

    if selectedRowIndex != indexPath.row { 
     self.thereIsCellTapped = true 
     self.selectedRowIndex = indexPath.row 
    } 
    else { 
     // there is no cell selected anymore 
     self.thereIsCellTapped = false 
     self.selectedRowIndex = -1 
    } 

    self.tableView.beginUpdates() 
    self.tableView.endUpdates() 
} 

Mit den oben genannten Änderungen in Ihrem didSelectRowAtIndexPath und heightForRowAtIndexPath Funktionen, die Sie sehen können, wenn eine Zelle ihre Hintergrundfarbe angezapft wird, wird es grau geändert werden, wenn es hoch und wenn eine andere Zelle die Zelle auf weiß und das Gewinde gemalt wird angezapft zu grau und immer wieder zulassen, nur eine Zelle zur Zeit tippen.

ich aber Sie profitieren können und lernen, wie ein Akkordeon Menü in diesen repo ich geschaffen habe zu tun, und ich plane, sehr bald aktualisieren bessere Ergebnisse zu handhaben, ist es handhabt ein mit UITableView wie Sie wollen.

Jeder Zweifel im Repository Sie können es hier posten.

Ich hoffe, das hilft Ihnen.

+0

Ich erhalte zwei Fehler mit Ihrem Code: "NSIndexPath kann nicht in int konvertiert werden" und "kann Int keinen Wert vom Typ NSIndexPath zuweisen". Diese treten auf beim Versuch, die angezapfte Zelle wieder weiß zu zeichnen und dann beim "Speichern des ausgewählten Indexes". Irgendeine Ahnung? –

+0

Ich habe diese beiden Probleme gelöst, nur ein dummer Fehler von meiner Seite. Mein Problem ist das jetzt. Ihr Code funktioniert jetzt gut, aber wenn Sie auf eine bereits erweiterte Zelle tippen, geht die Zelle nicht in ihren ursprünglichen Zustand zurück. –

+0

@DiegoPetrucci Siehe meine aktualisierte Antwort, um Ihre Zweifel zu klären. –

3

Ein einfacher Ansatz für nur eine Zelle zu einer Zeit erweitert:

Swift 3

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 

var selectedRowIndex = -1 
@IBOutlet weak var tableView: UITableView! 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if indexPath.row == selectedRowIndex { 
      return 90 //Expanded 
     } 
     return 40 //Not expanded 
    } 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     if selectedRowIndex == indexPath.row { 
      selectedRowIndex = -1 
     } else { 
      selectedRowIndex = indexPath.row 
     } 
     tableView.reloadRows(at: [indexPath], with: .automatic) 
    } 
} 

Dieser Code wird die Zelle geklickt und schließt zuvor geöffnete Zelle mit Animation erweitern.

+0

Danke es funktioniert sehr gut, wenn ich Ich habe versucht, einen Haltepunkt in der Anweisung "return 90 // Expanded" zu setzen, die dreimal ausgeführt wurde. Kannst du mir bitte sagen, warum? –

+0

Höhe für Zeile wird für jede Zeile in der Tabelle ausgeführt –

Verwandte Themen