2016-05-11 4 views
0

Also, mein Problem ist ziemlich einfach. Ich habe eine UITableView in einem UIViewController. Die Tabellenansicht enthält dynamische Zellen (benutzerdefinierte Zellen mit Bildern, Text usw. aus einer von mir erstellten Unterklasse), und diese Zellen gehören zu einer von mir erstellten Unterklasse. Alles läuft gut, da der Inhalt in jeder Zelle unterschiedlich ist. Das Problem ist, dass, wenn ich den scrollview der Zelle scrolle, die horizontal ist (ich habe ein UIScrollView in der Unteransicht der Zelle. Ich erstellte dieses scrollview auf der Zellenunterklasse), sagen wir zum Beispiel, indexPath.row == 0, und blättern die Tabellenansicht vertikal, nach etwa 8 Zellen, hat die neunte Zelle die Scrollansicht ebenfalls gescrollt. Dies liegt daran, dass die neunte Zelle tatsächlich die erste Zelle ist, die nur einen anderen Inhalt anzeigt, aber da es sich um die erste Zelle handelt, hat sie dieselbe Hintergrundoperation (die Bildlaufansicht scrollte).UITableViewCell mit scrollview wiederholen - welche Umgehungen gibt es?

Ich habe versucht, in den cellForRowAtIndexPath: ausrollen aber obwohl dies das Problem löst es schafft eine andere: Die erste Zelle, die gescrollt wurde nicht mehr ist. Um dieses neue Problem zu lösen, möchte ich hier eine Problemumgehung hinzufügen, die ein Wörterbuch von [Int: Bool] ist, also den IndexPath, der einem booleschen Wert entspricht. Wenn ich die erste Zelle scrollte, dann 0: wahr. Wenn ich die neunte Zelle erreiche (die gleich der ersten Zelle ist, aber mit IndexPath = 8), scrollte ich die horizontale Scrollansicht der Zelle ab. Wenn ich an den Anfang der Tabellenansicht zurückkomme und die erste Zelle erreiche, scrolle ich den horizontalen Bildlauf der Zelle zurück. Was denkt ihr?

Die andere Problemumgehung, die ich mir vorstellen kann, besteht darin, wiederverwendbare Zellen nicht mehr aus der Warteschlange zu nehmen, da ich nicht glaube, dass ich mehr als 30 bis 50 Zeilen in meiner Tabellenansicht haben werde. In Bezug auf die Leistung, welche Operation ist besser?

+1

Sie können die Methode -prepareForReuse für die Zellklasse implementieren, den Scrollview-Offset irgendwo speichern (nicht in der Zelle natürlich) und dann den contentOffset der scrollview der Zelle zurücksetzen. Wenn die Tabellenansicht eine zurückgegebene Zelle in -tableView zurückgibt: cellForRowAtIndexPath: Sie können den Offset der Scrollansicht auf den gespeicherten Wert setzen (wenn für diesen Indexpfad ein Offsetwert gespeichert ist). –

Antwort

0

Zuerst würde ich vorschlagen, dass Sie sorgfältig analysieren, ob das Entfernen von Scroll-Offset von der ersten Zelle eine so schlechte Idee ist. Wenn ich ein Benutzer bin und ich bis ganz nach unten scrolle, die erste Zelle unsichtbar machst, bist du sicher, dass ich nach dem Zurückscrollen nach oben in die gescrollte Position zurückkehren möchte? Die Antwort könnte Ja sein, aber Sie sollten darüber sorgfältig nachdenken, weil es Sie zur einfachsten Lösung führen könnte.

Aber wenn Sie es wirklich tun müssen, würde ich eine Variable haben, die den Status des Scrollens für jede Zeile speichert. Wenn Sie über ein Array von Objekten verfügen, aus denen Sie die erforderlichen Eigenschaften (Titel, Bild usw.) ziehen, können Sie diese Objekte als zusätzliche Eigenschaft hinzufügen. Andernfalls können Sie ein Array erstellen, das diese Informationen speichert (ich würde für diese Aufgabe ein Array über dem Wörterbuch bevorzugen).

+0

Danke für den Vorschlag mit der Eigentums-Sache. Ich werde Ihre Antwort akzeptieren, da ich diese einfachere Implementierung nicht berücksichtigt habe.Aber ob ich die Indexe, die ich horizontal gescrollt habe, "erinnern" sollte, frage ich ehrlich gesagt (bitte antworten Sie, da die Analogie sehr ähnlich ist): Wäre es nicht besser für die Benutzer, wenn sie eine Liste von Gerichten sehen könnten ein Restaurant und scrollte horizontal auf jede Zelle, um eine Beschreibung dieser Gerichte zu sehen, und die Tischansicht konnte sich an die gerollten Gerichte erinnern, so dass er Gerichte "weit weg" vergleichen konnte, ohne dieselben Zellen erneut scrollen zu müssen? – rgoncalv

+0

Entschuldigung für eine späte Antwort. In Bezug auf Ihr Beispiel würde ich sagen, dass ein Benutzer in einer solchen Situation erwarten könnte, dass er * interessante * Gerichte auswählt und dann auf "Vergleiche" klickt und entweder zur nächsten Ansicht mit einer für den Vergleich optimierten Schnittstelle weitergeleitet wird ODER bekommt die Zellen, die nicht ausgewählt wurden, werden herausgefiltert. Und im letzten Fall hast du recht - du würdest den Scroll-Status beibehalten wollen. Ich denke jedoch, dass Sie zustimmen werden, dass das Vergleichen von etwas, das nicht auf einen Bildschirm passt, nicht einfach ist :) –

-1

Grundsätzlich ist es ein Problem, das durch die Wiederverwendbarkeit von Tabellensichtzellen verursacht wird. Sie können Problemumgehungen haben, aber ich würde sagen, dass Dinge, die nicht wiederverwendet werden sollen, nicht wiederverwendet werden sollten.

Wenn Ihre Zellen alle ähnlich sind (mit geringen Unterschieden), können Sie nur eine Zellenkennung verwenden; Wenn Sie z. B. sehr unterschiedliche Zellentypen haben, hat ein Typ eine horizontale Bildlaufansicht, ein Typ nur einige Beschriftungen und Bilder. Sie sollten zwei Bezeichner verwenden, damit Zellen mit UIScrollView nicht wiederverwendet werden normale Zellen.

Und zur gleichen Zeit können Sie immer noch die notwendigen Aufräumarbeiten in prepareForReuse: tun, um sicherzustellen, dass Zellen, die gerade aus der Warteschlange genommen werden, einen Neuanfang haben.