Ich habe eine, UITableViewCell
die mit einem Objekt verknüpft ist, und ich muss feststellen, ob die Zelle sichtbar ist. Nach meinen Recherchen bedeutet dies, dass ich irgendwie auf das zugreifen muss, das UITableView
es enthält (von dort aus gibt es verschiedene Möglichkeiten, um zu überprüfen, ob es sichtbar ist). Ich frage mich also, ob UITableViewCell
es einen Zeiger auf das UITableView
gibt oder ob es eine andere Möglichkeit gibt, einen Zeiger aus der Zelle zu erhalten.
100
[cell superView]
vielleicht?Antworten:
Um zu vermeiden, dass die iOS-Version überprüft wird, gehen Sie iterativ die Übersichtsansichten aus der Zellenansicht nach oben, bis eine UITableView gefunden wird:
quelle
@property (weak, nonatomic) UITableView *tableView;
und intableView:cellForRowAtIndexPath:
gerade gesetztcell.tableView = tableView;
.In iOS7 Beta 5
UITableViewWrapperView
ist die Übersicht von aUITableViewCell
. AuchUITableView
ist Übersicht von aUITableViewWrapperView
.Für iOS 7 ist die Lösung also
UITableView *tableView = (UITableView *)cell.superview.superview;
Für iOSes bis iOS 6 ist die Lösung also
UITableView *tableView = (UITableView *)cell.superview;
quelle
UITableViewCell
Kategorie mit einer neuen Methode erstellen ,relatedTableView
die eine iOS-Version überprüft und die entsprechende SuperView zurückgibt.Swift 5 Erweiterung
Rekursiv
Schleife verwenden
quelle
view != nil
Vor dem Auspacken erfolgt eine Überprüfung. Aktualisiert auf saubereren CodeVor iOS7 war die Übersicht der Zelle diejenige
UITableView
, die sie enthielt. Ab iOS7 GM (wird also vermutlich auch in der öffentlichen Version verfügbar sein) ist die Übersicht der Zelle eine,UITableViewWrapperView
wobei die Übersicht die istUITableView
. Es gibt zwei Lösungen für das Problem.Lösung 1: eine erstellen
UITableViewCell
KategorieDies ist ein guter Ersatz für die Verwendung
cell.superview
, macht es einfach, Ihren vorhandenen Code umzugestalten - suchen und ersetzen Sie ihn einfach[cell relatedTable]
und geben Sie eine Bestätigung ein, um sicherzustellen, dass die Ansichtshierarchie, wenn sie sich in Zukunft ändert oder zurücksetzt, sofort angezeigt wird in Ihren Tests.Lösung 2: Fügen Sie einen schwachen
UITableView
Verweis auf hinzuUITableViewCell
Dies ist ein viel besseres Design, obwohl für die Verwendung in vorhandenen Projekten etwas mehr Code-Refactoring erforderlich ist.
tableView:cellForRowAtIndexPath
Verwenden Sie in Ihrer Verwendung SOUITableViewCell als Ihre Zellenklasse oder stellen Sie sicher, dass Ihre benutzerdefinierteSOUITableViewCell
Zellenklasse von einer Unterklasse abweicht, und weisen Sie die tableView der tableView-Eigenschaft der Zelle zu. Innerhalb der Zelle können Sie dann mit auf die enthaltene Tabellenansicht verweisenself.tableView
.quelle
[self.superview.superview isKindOfClass:[UITableView class]]
sollte der erste sein, denn das iOS 7 wird immer mehr.Wenn es sichtbar ist, hat es eine Übersicht. Und ... Überraschung ... die Übersicht ist ein UITableView-Objekt.
Eine Übersicht ist jedoch keine Garantie dafür, dass Sie auf dem Bildschirm angezeigt werden. UITableView bietet jedoch Methoden, um zu bestimmen, welche Zellen sichtbar sind.
Und nein, es gibt keinen dedizierten Verweis von einer Zelle auf eine Tabelle. Wenn Sie jedoch UITableViewCell unterordnen, können Sie eine einführen und diese bei der Erstellung festlegen. (Ich habe das selbst oft gemacht, bevor ich an die Subview-Hierarchie dachte.)
Update für iOS7: Apple hat hier die Subview-Hierarchie geändert. Wie bei der Arbeit mit Dingen, die nicht detailliert dokumentiert sind, besteht wie immer das Risiko, dass sich Dinge ändern. Es ist weitaus sicherer, die Ansichtshierarchie zu "crawlen", bis schließlich ein UITableView-Objekt gefunden wird.
quelle
Schnelle 2.2-Lösung.
Eine Erweiterung für UIView, die rekursiv nach einer Ansicht mit einem bestimmten Typ sucht.
oder kompakter (dank Kabiroberai):
In deiner Zelle nennst du es einfach:
Beachten Sie, dass UITableViewCell erst nach der Ausführung von cellForRowAtIndexPath zur UITableView hinzugefügt wird.
quelle
lookForSuperviewOfType:
Methodenkörper in eine Zeilereturn superview as? T ?? superview?.superviewOfType(type)
Was auch immer Sie am Ende durch Aufrufen von Super View oder über die Responderkette erreichen können, wird sehr fragil sein. Der beste Weg, dies zu tun, wenn die Zellen etwas wissen wollen, besteht darin, ein Objekt an die Zelle zu übergeben, die auf eine Methode reagiert, die die Frage beantwortet, die die Zelle stellen möchte, und den Controller die Logik implementieren zu lassen, zu bestimmen, was zu beantworten ist (Aufgrund Ihrer Frage möchte die Zelle wissen, ob etwas sichtbar ist oder nicht).
Erstellen Sie ein Delegatenprotokoll in der Zelle, legen Sie den Delegaten der Zelle auf tableViewController fest und verschieben Sie die gesamte UI-Steuerlogik in tableViewCotroller.
Die Zellen der Tabellenansicht sollten eine Dum-Ansicht sein, in der nur Informationen angezeigt werden.
quelle
Ich habe eine Kategorie in UITableViewCell erstellt, um die übergeordnete tableView abzurufen:
Beste,
quelle
Hier ist die Swift- Version basierend auf den obigen Antworten. Ich habe in
ExtendedCell
für die spätere Verwendung verallgemeinert .Ich hoffe das hilft :)
quelle
Ich habe diese Lösung auf Gabes Vorschlag gestützt, dass
UITableViewWrapperView
Objekt die Übersicht über dasUITableViewCell
Objekt in iOS7 Beta5 ist.Unterklasse
UITableviewCell
:quelle
Ich habe mir ein wenig von der obigen Antwort geliehen und geändert und mir das folgende Snippet ausgedacht.
Das Bestehen im Unterricht bietet die Flexibilität, in anderen Fällen andere Ansichten als UITableView zu durchlaufen und abzurufen.
quelle
Meine Lösung für dieses Problem ähnelt etwas anderen Lösungen, verwendet jedoch eine elegante for-Schleife und ist kurz. Es sollte auch zukunftssicher sein:
quelle
for (view = self.superview; view && ![view isKindOfClass:UITableView.class]; view = view.superview);
quelle
Verwenden Sie anstelle der Übersicht ["UItableViewvariable" visibleCells].
Ich habe das in einer foreach-Schleife verwendet, um die Zellen zu durchlaufen, die die App gesehen hat, und es hat funktioniert.
Klappt wunderbar.
quelle
Minimal getestet, aber dieses nicht generische Swift 3-Beispiel scheint zu funktionieren:
quelle
Dieser Code
`UITableView *tblView=[cell superview];
gibt Ihnen eine Instanz der UItableview, die die Tabelle-Ansichtszelle enthältquelle
Ich schlage vor, dass Sie die Ansichtshierarchie auf diese Weise durchlaufen, um die übergeordnete UITableView zu finden:
Andernfalls wird Ihr Code beschädigt, wenn Apple die Ansichtshierarchie erneut ändert .
Eine andere Antwort , die auch die Hierarchie durchquert, ist rekursiv.
quelle
http://www.curiousfind.com/blog/646 Vielen Dank
quelle
Sie können es mit einer Codezeile erhalten.
quelle
quelle
von @idris Antwort Ich habe eine Erweiterung für UITableViewCell in Swift geschrieben
quelle