Ich erstelle eine App mit einer Feed-Ansicht für vom Benutzer eingereichte Beiträge. Diese Ansicht hat eine UITableViewmit einer benutzerdefinierten UITableViewCellImplementierung. In dieser Zelle habe ich eine andere UITableViewzum Anzeigen von Kommentaren. Das Wesentliche ist ungefähr so:
Feed TableView
PostCell
Comments (TableView)
CommentCell
PostCell
Comments (TableView)
CommentCell
CommentCell
CommentCell
CommentCell
CommentCell
Der erste Feed wird mit 3 Kommentaren zur Vorschau heruntergeladen. Wenn jedoch weitere Kommentare vorhanden sind oder der Benutzer einen Kommentar hinzufügt oder löscht, möchte ich den vorhandenen PostCellPlatz in der Feed-Tabellenansicht aktualisieren, indem ich ihn CommentCellszur Kommentartabelle hinzufüge oder daraus entferne der PostCell. Ich benutze derzeit den folgenden Helfer, um dies zu erreichen:
// (PostCell.swift) Handle showing/hiding comments
func animateAddOrDeleteComments(startRow: Int, endRow: Int, operation: CellOperation) {
let table = self.superview?.superview as UITableView
// "table" is outer feed table
// self is the PostCell that is updating it's comments
// self.comments is UITableView for displaying comments inside of the PostCell
table.beginUpdates()
self.comments.beginUpdates()
// This function handles inserting/removing/reloading a range of comments
// so we build out an array of index paths for each row that needs updating
var indexPaths = [NSIndexPath]()
for var index = startRow; index <= endRow; index++ {
indexPaths.append(NSIndexPath(forRow: index, inSection: 0))
}
switch operation {
case .INSERT:
self.comments.insertRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.None)
case .DELETE:
self.comments.deleteRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.None)
case .RELOAD:
self.comments.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.None)
}
self.comments.endUpdates()
table.endUpdates()
// trigger a call to updateConstraints so that we can update the height constraint
// of the comments table to fit all of the comments
self.setNeedsUpdateConstraints()
}
override func updateConstraints() {
super.updateConstraints()
self.commentsHeight.constant = self.comments.sizeThatFits(UILayoutFittingCompressedSize).height
}
Dies führt das Update einwandfrei durch. Der Beitrag wird an Ort und Stelle aktualisiert, wobei Kommentare PostCellwie erwartet innerhalb des Beitrags hinzugefügt oder entfernt werden . Ich verwende die automatische Größenanpassung PostCellsin der Feed-Tabelle. Die Kommentartabelle des wird PostCellerweitert, um alle Kommentare anzuzeigen, aber die Animation ist etwas ruckelig und die Tabelle rollt ungefähr ein Dutzend Pixel auf und ab, während die Zellenaktualisierungsanimation stattfindet.
Das Springen während der Größenänderung ist etwas nervig, aber mein Hauptproblem kommt danach. Wenn ich jetzt im Feed nach unten scrolle, ist das Scrollen wie zuvor reibungslos. Wenn ich jedoch über die Zelle nach oben scrolle, deren Größe ich gerade nach dem Hinzufügen von Kommentaren geändert habe, springt der Feed einige Male zurück, bevor er den oberen Rand des Feeds erreicht. Ich iOS8richte die Zellen für die automatische Größenanpassung für den Feed folgendermaßen ein:
// (FeedController.swift)
// tableView is the feed table containing PostCells
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 560
Wenn ich das entferne estimatedRowHeight, wird die Tabelle immer dann nach oben gescrollt, wenn sich die Zellenhöhe ändert. Ich fühle mich jetzt ziemlich festgefahren und könnte als neuer iOS-Entwickler alle Tipps gebrauchen, die Sie haben könnten.