Scroll To Row Bug/Problem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Scroll To Row Bug/Problem

    Hallo,

    ich habe es aktuell mit einer Problematik zu tun die für mich nicht ganz erklärbar ist und zwar versuche über scrollToRow an den Anfang meiner TableView zu scrollen. Das gelingt jedoch nur bis zu einer bestimmten Position. Ich vermute das die Zellen beim Scrollen durch reusableCell ab einem bestimmt Punkt aus der aktuellen View verschwinden und dann kein indexPath mehr vorhanden ist und deswegen nicht zu der Zelle geschellt wird die ich gerne hätte.

    Kennt sich vielleicht jemand mit solch einer Problematik aus und weiß was zu tun ist ?

    Hier mein Code:

    Quellcode

    1. else if indexPath.section == 3 {
    2. let cell = uploadSettingsTableView.dequeueReusableCell(withIdentifier: "categories", for: indexPath) as! SelectCategoriesTableViewCell
    3. if cellCategorieStatus == false {
    4. cell.isHidden = true
    5. let indexPATH = IndexPath(row: 0, section: 0)
    6. self.uploadSettingsTableView.scrollToRow(at: indexPATH, at: .top, animated: true)
    7. } else {
    8. cell.isHidden = false
    9. cell.categorieLabel.text = categorie[indexPath.row]
    10. }
    11. return cell
    12. }
    Alles anzeigen
  • Wieso setzt Du Cells auf hidden?

    Wenn eine Zeile nicht angezeigt werden soll, dann solltest Du dies über die Anzahl der Zeilen je Section, also tableView(_:numberOfRowsInSection:) und tableView(_:cellForRowAt:) lösen.

    Weiterhin sollte dequeueReusableCell(withIdentifier:for:) nur innerhalb von tableView(_:cellForRowAt:) verwendet werden.
  • AppleDeveloper schrieb:

    An Sicht sieht das ScrollToRow korrekt aus. Bist du dir sicher, dass die Zelle nicht auf Hidden gesetzt ist? Also das würde die Problematik erklären. Da es Reusable Views sind musst du die bei der Erzeugung auf Hidden false setzen. Wenn in jeder Section die selben Zellen genommen werden, dann auch in bei der Erzeugung jeder Section.
    Die Zelle zu der ich scrollen möchte setze ich nicht auf hidden. Deswegen verstehe ich auch nicht warum es ab einem bestimmten Punkt nicht mehr funktioniert zu meiner ersten Zelle zu scrollen.


    MCDan schrieb:

    Wieso setzt Du Cells auf hidden?

    Wenn eine Zeile nicht angezeigt werden soll, dann solltest Du dies über die Anzahl der Zeilen je Section, also tableView(_:numberOfRowsInSection:) und tableView(_:cellForRowAt:) lösen.

    Weiterhin sollte dequeueReusableCell(withIdentifier:for:) nur innerhalb von tableView(_:cellForRowAt:) verwendet werden.
    Tut mir leid, der Code Abschnitt kommt aus der tableView cellForRowAt Funktion. Hätte ich vielleicht deutlicher machen müssen. Und nun gut ich könnte es natürlich auch so machen das ich dann einfach die Zeilen in der jeweiligen Section auf null setze aber ich hab da meiner Art und Weise keine Nachteile erkennen können.

    Mir ist übrigen aufgefallen das scrollToRow funktioniert, so lange ich nicht die rowHeight von indexPath.section == 1 verändere. Das betrifft diesen Code Teil: So lange die rowHeight bei 53 bleibt funktioniert alles einwandfrei. Ändere ich sie auf 185 funktioniert es nur bis zu einem bestimmten Punkt.


    Quellcode

    1. if cell.switchTimerButton.isOn == false {
    2. uploadSettingsTableView.rowHeight = 53
    3. } else {
    4. uploadSettingsTableView.rowHeight = 185
    5. }


    Hier ist aber nochmal die gesamte cellForRowAt Funktion sichtbar. Wie gesagt das ganze macht nicht wirklich Sinn in meinen Augen, also ich verstehe nicht warum das nicht funktioniert.

    Quellcode

    1. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    2. if indexPath.section == 0 {
    3. let cell = uploadSettingsTableView.dequeueReusableCell(withIdentifier: "SetPrivacyCell", for: indexPath) as! UploadSettingsTableViewCell
    4. cell.selectionStyle = .none
    5. cellPrivacyStatus = cell.switchPrivacyButton.isOn
    6. return cell
    7. } else if indexPath.section == 1 {
    8. let cell = uploadSettingsTableView.dequeueReusableCell(withIdentifier: "SetTimerCell", for: indexPath) as! UploadSettingsTableViewCell
    9. cell.timePicker.minuteInterval = 5
    10. cell.timePicker.countDownDuration = 300
    11. cell.selectionStyle = .none
    12. cell.timePicker.countDownDuration = self.timePickerValue
    13. if cell.switchTimerButton.isOn == false {
    14. uploadSettingsTableView.rowHeight = 53
    15. } else {
    16. uploadSettingsTableView.rowHeight = 185
    17. }
    18. cellTimerStatus = cell.switchTimerButton.isOn
    19. return cell
    20. } else if indexPath.section == 3 {
    21. let cell = uploadSettingsTableView.dequeueReusableCell(withIdentifier: "categories", for: indexPath) as! SelectCategoriesTableViewCell
    22. if cellCategorieStatus == false {
    23. cell.isHidden = true
    24. let indexPATH = IndexPath(row: 0, section: 0)
    25. self.uploadSettingsTableView.scrollToRow(at: indexPATH, at: .top, animated: true)
    26. } else {
    27. cell.isHidden = false
    28. cell.categorieLabel.text = categorie[indexPath.row]
    29. }
    30. return cell
    31. } else {
    32. let cell = uploadSettingsTableView.dequeueReusableCell(withIdentifier: "AddCategorieCell", for: indexPath) as! UploadSettingsTableViewCell
    33. cell.selectionStyle = .none
    34. cellCategorieStatus = cell.switchCategorieButton.isOn
    35. return cell
    36. }
    37. }
    Alles anzeigen
  • ThisIsBeat schrieb:

    Tut mir leid, der Code Abschnitt kommt aus der tableView cellForRowAt Funktion.
    ?( Bist Du sicher, dass dies die richtige Stelle zum Scrollen ist? Überlege einmal, wann und zu welchem Zweck diese Methode genutzt wird: Wie soll ein Positionieren der Tabelle funktionieren, wenn noch gar nicht alle Zellen instanziert wurden?

    Ich vermute stark, dass Du das Blättern woanders, z. B. in einem viewWillAppear benötigst. Unter welchen Bedingungen soll denn positioniert werden?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    ThisIsBeat schrieb:

    Tut mir leid, der Code Abschnitt kommt aus der tableView cellForRowAt Funktion.
    ?( Bist Du sicher, dass dies die richtige Stelle zum Scrollen ist? Überlege einmal, wann und zu welchem Zweck diese Methode genutzt wird: Wie soll ein Positionieren der Tabelle funktionieren, wenn noch gar nicht alle Zellen instanziert wurden?
    Ich vermute stark, dass Du das Blättern woanders, z. B. in einem viewWillAppear benötigst. Unter welchen Bedingungen soll denn positioniert werden?

    Mattes
    Also in meiner TableView befinden sich Switch Buttons und unter anderem auch einer namens categorieSwitchButton. Abhängig von seinem Status möchte ich zu meiner ersten Zelle scrollen.

    Ist categorieSwitchButton auf false gesetzt, soll nach oben gescrollt werden. Abhängig von categorieSwitchbutton ist dann auch wie die Zellen in der cellForRowAt Funktion angezeigt werden sollen.
    Damit categorieSwitchbutton auch je nach Status geupdatet wird habe ich folgende Funktion:


    Quellcode

    1. @IBAction func switchButtonsTapped(_ sender: Any) {
    2. self.uploadSettingsTableView.reloadData()
    3. }
  • Ah ok, innerhalb von tableView(_:cellForRowAt:) passt dequeueReusableCell(withIdentifier:for:) natürlich, allerdings würde ich dort kein scrollToRow(at:at:animated:) vermuten.

    Wenn ich den Code richtig verstehe, dann soll die TableView auf die erste Zeile springen, sobald die TableView eine Zelle für die 4. Section anzeigen möchte. Ich weiß jetzt nicht wie viele Zellen in den Sections 1-3 angezeigt werden, aber wenn die 4. Section nicht direkt sichtbar ist, dann lässt sich diese nie anzeigen, da der Code die TableView immer wieder auf die 1. Zeile springen lässt, sobald eine Zeile der 4. Section angezeigt werden soll.

    Macht ja irgendwie keinen Sinn oder? ?(

    Innerhalb von switchButtonsTapped würde scrollToRow(at:at:animated:) doch deutlich mehr Sinn machen. ;)
  • @MCDan Du sollst recht haben, am Ende war das die Lösung. Außerdem war auch noch die Reihenfolge entscheidend aber hier die Lösung des Problems:


    Quellcode

    1. @IBAction func switchButtonsTapped(_ sender: Any) {
    2. self.uploadSettingsTableView.reloadData()
    3. let indexPath = IndexPath(row: 0, section: 0)
    4. self.uploadSettingsTableView.scrollToRow(at: indexPath, at: .top, animated: true)
    5. }
    Vielen Dank für die Hilfe, war alles wirklich sehr hilfreich :D