Auto-scrollen, um eine Zelle mit einem bestimmten Wert
Habe ich eine Liste von zahlen in einer Tabelle anzeigen, wie diese.
Wie Sie sehen können die zahlen wiederholt werden. Wir betrachten eine Reihe von wiederholten zahlen als Gruppe. Also es gibt Gruppe 1, Gruppe 2 und so weiter.
Was ich will zu tun ist, wenn die app gestartet wird, muss ich scrollen, um die start-position einer bestimmten Gruppe automatisch. Bevor wir weiter, hier ist mein code bisher.
import UIKit
class TableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
private var scrollToTime = true
private var items = [Int]()
private var groupNoToScroll = 12
override func viewDidLoad() {
super.viewDidLoad()
items = [1, 1, 2, 2, 2, 3, 4, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 16, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 21, 22, 22, 23, 23, 23]
}
//MARK: - UITableViewDataSource
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = String(items[indexPath.row])
return cell
}
//MARK: - UITableViewDelegate
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
let lastRow = tableView.indexPathsForVisibleRows()?.last as NSIndexPath
if indexPath.row == lastRow.row {
if scrollToTime == true {
let indexPath = NSIndexPath(forRow: groupNoToScroll, inSection: 0)
tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
scrollToTime = false
}
}
}
}
Habe ich zugewiesen, der Wert 12 für die variable groupNoToScroll
. Dies bedeutet, wenn die app startet, möchte ich die Tabelle anzeigen werden automatisch gescrollt, um den start in die Zellen des 12s-Gruppe.
Aber derzeit, was mein code tut, ist navigieren Sie zu dem 12-Zelle nicht die Zelle, die die Wert 12. Meine Frage ist wie kann ich überprüfen, mit der Zellen-Werte und Blättern Sie zu der Nummer, die ich angeben?
- Haben Sie eine Iteration durch das array und um den index der erste Auftritt von
groupNoToScroll
. - Es ist jedoch in der Regel nicht eine gute Idee, überschreiben tableView:willDisplayCell: . Was sind Sie wirklich an?
- Ich wollte den automatischen Bildlauf nach alle Zellen geladen wurden. Also laut dieser Antwort
willDIsplayCell
ist, wo ich brauche, um zu überprüfen, dass. Gibt es einen besseren Weg zu gehen über diese? - Keine willDisplayCell ist dafür nicht konstruiert. Sie riskieren eine Endlosschleife. Ich würde nur einen Bildlauf zu der zugehörigen Zelle in viewDidLoad mithilfe scrollToRowAtIndexPath. Funktioniert einwandfrei. Ich wusste, dass eine Menge.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie verwenden, finden Sie den index des Elements(die entsprechende Zeile), und dann navigieren Sie zu diesem index.
find
Funktion liefert den index eines bestimmten Elements im array.willDisplayCell
Funktion. Ich würde es tun, nach dem AufrufreloadData
. stackoverflow.com/questions/16071503/...viewDidAppear
Methode, denn ich möchte das scrollen passiert jedes mal, wenn ich die Ansicht verlassen und wieder kommen.reloadData()
jedes mal, bevor Sie die auto-scroll? Wenn ja, können Sie mir bitte sagen, den Grund?UITableView
. Da Sie es tun inviewDidAppear
stellen Sie sicher, dass dieUITableView
geladen hat die Daten vor dem Aufruf der scroll-Funktion.groupNoToScroll
ich angeben existiert nicht in deritems
array. Es muss also nicht scrollen. Gibt es eine Möglichkeit, es zu machen, wie, wenn der angegebene Wert nicht vorhanden ist, Blättern Sie zu dem nächstgelegenen Wert?Swift 4:
(erste, natürlich, müssen Sie Werte zuweisen Zeile und Abschnitt basiert auf die Zelle, die Sie möchten, Blättern Sie zu)
Swift 3.0
Swift 4.0
Tun dies, um zu finden, die das erste element im array, die gleich groupNoToScroll. Dann gehen Sie auf diese Zeile.
Aber ich würde empfehlen, dies zu tun, in viewDidAppear.
Als Isuru darauf hingewiesen, lieber die suchen-Funktion.
find
denen ich dachte, eine elegantere und sauberere Weg, es zu tun. Aber nochmal danke 🙂