UITableView
auf statische Zellen setzen.
Ist es möglich, einige der Zellen programmgesteuert auszublenden?
ios
objective-c
uitableview
Shmidt
quelle
quelle
IBOutletCollection
aber ich sehe nicht, wie das einen Unterschied machen würde. Ich habe den Code erst gestern heruntergeladen, daher glaube ich nicht, dass es sich um eine alte Version handelt.So verbergen Sie statische Zellen in UITable:
In Ihrer UITableView-Controller-Delegatenklasse:
Ziel c:
Schnell:
Diese Methode wird für jede Zelle in der UITable aufgerufen. Sobald es für die Zelle aufgerufen wird, die Sie ausblenden möchten, setzen wir ihre Höhe auf 0. Wir identifizieren die Zielzelle, indem wir einen Ausgang dafür erstellen:
quelle
ClipToBounds
Problem zu vermeiden , können Sie die Zelle auch auf "Ausgeblendet" setzen. Das scheint mir sauberer zu sein. ;-)Der beste Weg ist wie im folgenden Blog beschrieben: http://ali-reynolds.com/2013/06/29/hide-cells-in-static-table-view/
quelle
Meine Lösung geht in eine ähnliche Richtung wie Gareth, obwohl ich einige Dinge anders mache.
Hier geht:
1. Verstecken Sie die Zellen
Es gibt keine Möglichkeit, die Zellen direkt auszublenden.
UITableViewController
ist die Datenquelle, die die statischen Zellen bereitstellt, und derzeit gibt es keine Möglichkeit, "keine Zelle x bereitzustellen" anzugeben. Wir müssen also unsere eigene Datenquelle bereitstellen, die an die delegiertUITableViewController
, um die statischen Zellen zu erhalten.Am einfachsten ist es
UITableViewController
, alle Methoden zu unterordnen und zu überschreiben , die sich beim Ausblenden von Zellen anders verhalten müssen .Im einfachsten Fall (Einzelabschnitts-Tabelle, alle Zellen haben die gleiche Höhe) würde dies folgendermaßen aussehen:
Wenn Ihre Tabelle mehrere Abschnitte enthält oder die Zellen unterschiedliche Höhen haben, müssen Sie weitere Methoden überschreiben. Hier gilt das gleiche Prinzip: Sie müssen indexPath, section und row versetzen, bevor Sie an super delegieren.
Beachten Sie auch, dass der indexPath-Parameter für Methoden wie
didSelectRowAtIndexPath:
für dieselbe Zelle je nach Status unterschiedlich ist (dh die Anzahl der ausgeblendeten Zellen). Daher ist es wahrscheinlich eine gute Idee, jeden indexPath-Parameter immer zu versetzen und mit diesen Werten zu arbeiten.2. Animieren Sie die Änderung
Wie Gareth bereits sagte, treten große Störungen auf, wenn Sie Änderungen mithilfe der
reloadSections:withRowAnimation:
Methode animieren .Ich habe herausgefunden, dass
reloadData:
die Animation erheblich verbessert wird, wenn Sie unmittelbar danach anrufen (nur noch kleine Störungen). Die Tabelle wird nach der Animation korrekt angezeigt.Was ich also mache ist:
quelle
numberOfRowsInSection:
nur aufgerufen wird, wenn die Tabelle zum ersten Mal geladen wird. Wenn ich [self.tableView reloadData] aufrufe -numberOfRowsInSection:
wird nie wieder aufgerufen. NurcellForRowAtIndexPath:
heißt. Was vermisse ich?cellOneOutlet.hidden = true
Überschreiben Sie nun die folgende Methode, überprüfen Sie, welcher Zellenstatus ausgeblendet ist, und geben Sie die Höhe 0 für diese Zellen zurück. Dies ist eine von vielen Möglichkeiten, wie Sie jede Zelle in statischer tableView schnell ausblenden können.
quelle
let tableViewCell = super.tableView(tableView,cellForRowAtIndexPath: indexPath)
. Ich gehe davon aus, dass es durch ersetzt wirdlet tableViewCell = tableView.cellForRow(at: indexPath as IndexPath)
.UITableViewController
, habe ich keineUITableView
Delegatmethoden.heightForRow
Benötige ich auch andere Methoden , um es zum Aufrufen zu bringen ?Ich habe mir eine Alternative ausgedacht, bei der Abschnitte tatsächlich ausgeblendet und nicht gelöscht werden. Ich habe den Ansatz von @ henning77 ausprobiert, bin aber immer wieder auf Probleme gestoßen, als ich die Anzahl der Abschnitte der statischen UITableView geändert habe. Diese Methode hat bei mir sehr gut funktioniert, aber ich versuche hauptsächlich, Abschnitte anstelle von Zeilen auszublenden. Ich entferne einige Zeilen im laufenden Betrieb erfolgreich, aber es ist viel chaotischer, deshalb habe ich versucht, Dinge in Abschnitte zu gruppieren, die ich ein- oder ausblenden muss. Hier ist ein Beispiel, wie ich Abschnitte verstecke:
Zuerst deklariere ich eine NSMutableArray-Eigenschaft
In viewDidLoad (oder nachdem Sie Ihre Daten abgefragt haben) können Sie dem Array Abschnitte hinzufügen, die Sie ausblenden möchten.
Implementieren Sie anschließend die folgenden TableView-Delegatmethoden
Setzen Sie dann die Höhe der Kopf- und Fußzeile für ausgeblendete Abschnitte auf 1, da Sie die Höhe nicht auf 0 setzen können. Dies führt zu einem zusätzlichen Abstand von 2 Pixel. Wir können dies jedoch ausgleichen, indem wir die Höhe der nächsten sichtbaren Kopfzeile anpassen.
Wenn Sie dann bestimmte Zeilen ausblenden müssen, können Sie die Anzahl der ZeilenInSection anpassen und festlegen, welche Zeilen in cellForRowAtIndexPath zurückgegeben werden. In diesem Beispiel habe ich hier einen Abschnitt mit drei Zeilen, in denen drei leer sein könnten und entfernt werden müssen.
Verwenden Sie diesen offsetIndexPath, um den indexPath für Zeilen zu berechnen, in denen Sie Zeilen bedingt entfernen. Wird nicht benötigt, wenn Sie nur Abschnitte ausblenden
Es gibt viele Methoden zum Überschreiben, aber was mir an diesem Ansatz gefällt, ist, dass er wiederverwendbar ist. Richten Sie das Array hiddenSections ein, fügen Sie es hinzu, und die richtigen Abschnitte werden ausgeblendet. Das Ausblenden der Reihen ist etwas kniffliger, aber möglich. Wir können nicht einfach die Höhe der Zeilen, die wir ausblenden möchten, auf 0 setzen, wenn wir eine gruppierte UITableView verwenden, da die Rahmen nicht korrekt gezeichnet werden.
quelle
NSMutableSet
fürhiddenSections
verwenden. Es ist viel schneller, da Sie meistens auf Mitgliedschaft testen.NSMutableSet
fürhiddenSections
, obwohl ich verstehe, dass der Punkt Ihrer Antwort eher konzeptionell als wählerisch war, welche Art von Datenstruktur Sie verwenden sollten.Es stellt sich heraus, dass Sie Zellen in einer statischen UITableView ein- und ausblenden können - und zwar mit Animation. Und es ist nicht so schwer zu erreichen.
Demo-Projekt
Demo-Projektvideo
Das Wesentliche:
Use tableView:heightForRowAtIndexPath:
um Zellenhöhen basierend auf einem bestimmten Status dynamisch anzugeben.tableView.beginUpdates();tableView.endUpdates()
tableView.cellForRowAtIndexPath:
innerhalbtableView:heightForRowAtIndexPath:
. Verwenden Sie zwischengespeicherte indexPaths, um die Zellen zu unterscheiden.Mehr Infos in meinem Blog (russische Sprache)
quelle
Ja, das ist definitiv möglich, obwohl ich im Moment mit dem gleichen Problem zu kämpfen habe. Ich habe es geschafft, die Zellen zum Verstecken zu bringen und alles funktioniert in Ordnung, aber ich kann das Ding derzeit nicht ordentlich animieren. Folgendes habe ich gefunden:
Ich verstecke Zeilen basierend auf dem Status eines EIN / AUS-Schalters in der ersten Zeile des ersten Abschnitts. Wenn der Schalter auf ON steht, befindet sich im selben Abschnitt 1 Zeile darunter, andernfalls befinden sich 2 verschiedene Zeilen.
Ich habe einen Selektor aufgerufen, wenn der Schalter umgeschaltet ist, und ich setze eine Variable, um anzuzeigen, in welchem Zustand ich mich befinde. Dann rufe ich auf:
Ich überschreibe die Funktion tableView: willDisplayCell: forRowAtIndexPath: und wenn die Zelle ausgeblendet werden soll, mache ich Folgendes :
Das verbirgt die Zelle und ihren Inhalt, entfernt aber nicht den Platz, den sie einnimmt.
Überschreiben Sie zum Entfernen des Leerzeichens die tableView: heightForRowAtIndexPath: und geben Sie 0 für Zeilen zurück, die ausgeblendet werden sollen.
Sie müssen auch tableView: numberOfRowsInSection: überschreiben und die Anzahl der Zeilen in diesem Abschnitt zurückgeben. Sie müssen hier etwas Seltsames tun, damit bei einer gruppierten Tabelle die abgerundeten Ecken in den richtigen Zellen auftreten. In meiner statischen Tabelle befindet sich der vollständige Satz von Zellen für den Abschnitt, sodass die erste Zelle die Option enthält, dann 1 Zelle für die EIN-Statusoptionen und 2 weitere Zellen für die AUS-Statusoptionen, insgesamt 4 Zellen. Wenn die Option aktiviert ist, muss ich 4 zurückgeben. Dies schließt die versteckte Option ein, damit die zuletzt angezeigte Option ein abgerundetes Feld enthält. Wenn die Option deaktiviert ist, werden die letzten beiden Optionen nicht angezeigt, sodass ich 2 zurückgebe. Dies alles fühlt sich klobig an. Entschuldigung, wenn dies nicht sehr klar ist, ist es schwierig zu beschreiben. Um den Aufbau zu veranschaulichen, ist dies der Aufbau des Tabellenabschnitts in IB:
Wenn die Option aktiviert ist, werden in der Tabelle zwei Zeilen angezeigt:
Wenn die Option deaktiviert ist, werden in der Tabelle vier Zeilen angezeigt:
Dieser Ansatz fühlt sich aus mehreren Gründen nicht richtig an. Er ist genau so weit wie ich bisher mit meinen Experimenten gekommen bin. Bitte lassen Sie mich wissen, wenn Sie einen besseren Weg finden. Die Probleme, die ich bisher beobachtet habe, sind:
Es fühlt sich falsch an, der Tabelle mitzuteilen, dass sich die Anzahl der Zeilen von der vermutlich in den zugrunde liegenden Daten enthaltenen unterscheidet.
Ich kann die Veränderung nicht animieren. Ich habe versucht, tableView: reloadSections: withRowAnimation: anstelle von reloadData zu verwenden, und die Ergebnisse scheinen keinen Sinn zu ergeben. Ich versuche immer noch, dies zum Laufen zu bringen. Derzeit scheint die tableView nicht die richtigen Zeilen zu aktualisieren, sodass eine verborgen bleibt, die angezeigt werden soll, und eine Leere unter der ersten Zeile verbleibt. Ich denke, dies könnte mit dem ersten Punkt über die zugrunde liegenden Daten zusammenhängen.
Hoffentlich kann jemand alternative Methoden vorschlagen oder vielleicht die Animation erweitern, aber vielleicht können Sie damit anfangen. Ich entschuldige mich für das Fehlen von Hyperlinks zu Funktionen. Ich habe sie eingefügt, aber sie wurden vom Spamfilter abgelehnt, weil ich ein ziemlich neuer Benutzer bin.
quelle
[[self tableView] reloadData];
nachdem Sie die Zellen versteckt habenreturn [super tableView:tableView cellForRowAtIndexPath:indexPath];
inUITableViewController
Unterklasse statische Zellen zu schaffen.Nach Justas 'Antwort, aber für Swift 4:
quelle
tableView.reloadRows(at:, with:)
, um die Zellen zu aktualisieren, wenn Sie die Höhe ändern, während die Zeile bereits sichtbar ist.Okay, nach einigem Versuch habe ich eine nicht häufige Antwort. Ich verwende die Variable "isHidden" oder "hidden", um zu überprüfen, ob diese Zelle ausgeblendet werden soll.
Erstellen Sie ein IBOutlet für Ihren View Controller.
@IBOutlet weak var myCell: UITableViewCell!
Aktualisieren Sie die
myCell
in Ihrer benutzerdefinierten Funktion. Beispiel: Sie können sie in viewDidLoad hinzufügen:override func viewDidLoad() { super.viewDidLoad() self.myCell.isHidden = true }
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let cell = super.tableView(tableView, cellForRowAt: indexPath) guard !cell.isHidden else { return 0 } return super.tableView(tableView, heightForRowAt: indexPath) }
Dies reduziert Ihre Logik bei der Delegate-Methode und Sie müssen sich nur auf Ihre Geschäftsanforderungen konzentrieren.
quelle
Die obigen Antworten, die Zellen ausblenden / anzeigen, rowHeight ändern oder mit Einschränkungen für das automatische Layout herumspielen, haben bei mir aufgrund von Problemen mit dem automatischen Layout nicht funktioniert. Der Code wurde unerträglich.
Für eine einfache statische Tabelle funktionierte das Beste für mich:
Hier ist ein Beispiel von meinem Table View Controller:
quelle
Einfache kompatible Methode für iOS 11 und IB / Storyboard
Für iOS 11 stellte ich fest, dass eine modifizierte Version von Mohamed Salehs Antwort am besten funktioniert, wobei einige Verbesserungen auf der Dokumentation von Apple basieren. Es animiert gut, vermeidet hässliche Hacks oder fest codierte Werte und verwendet Zeilenhöhen, die bereits im Interface Builder festgelegt wurden .
Das Grundkonzept besteht darin, die Zeilenhöhe für alle ausgeblendeten Zeilen auf 0 zu setzen. Verwenden Sie dann
tableView.performBatchUpdates
, um eine Animation auszulösen, die konsistent funktioniert.Stellen Sie die Zellenhöhen ein
Sie wollen sicherstellen
cellIsHidden
undindexPathOfHiddenCell
werden in geeigneter Weise auf Ihren Anwendungsfall eingestellt. Für meinen Code sind sie Eigenschaften auf meinem Table View Controller.Die Zelle umschalten
Um die Sichtbarkeit zu steuern (wahrscheinlich eine Schaltflächenaktion oder
didSelectRow
), schalten Sie den cellIsHidden-Status innerhalb einesperformBatchUpdates
Blocks um:Apple empfiehlt
performBatchUpdates
überbeginUpdates
/endUpdates
wann immer möglich.quelle
Ich habe eine Lösung gefunden, um versteckte Zellen in einer statischen Tabelle zu animieren.
Es wird nur ein zusätzliches Wörterbuch benötigt:
Schauen Sie sich auch die Implementierung von MyTableViewController an. Wir benötigen zwei Methoden, um indexPath zwischen sichtbaren und unsichtbaren Indizes zu konvertieren ...
Eine IBAction zur Änderung des UISwitch-Werts:
Einige UITableViewDataSource- und UITableViewDelegate-Methoden:
quelle
Antworte schnell :
Fügen Sie Ihrem TableViewController die folgende Methode hinzu:
Wenn die tableView versucht, die Zelle zu zeichnen, die Sie ausblenden möchten, wird sie nicht angezeigt, da ihre Höhe dank der obigen Methode auf 0pt gesetzt wird. Alles andere bleibt unverändert.
Bitte beachten Sie, dass
indexPathOfCellYouWantToHide
dies jederzeit geändert werden kann :)quelle
In> Swift 2.2 habe ich hier einige Antworten zusammengefasst.
Stellen Sie eine Verbindung zum Storyboard her, um eine Verknüpfung zu Ihrer staticCell herzustellen.
Ich möchte meine erste Zelle ausblenden, also setze ich die Höhe wie oben beschrieben auf 0.
quelle
Swift 4:
quelle
Für das einfachste Szenario, wenn Sie Zellen ganz unten in der Tabellenansicht ausblenden, können Sie das contentInset von tableView anpassen, nachdem Sie die Zelle ausgeblendet haben:
quelle
Dies ist eine neue Methode, um dies mit https://github.com/k06a/ABStaticTableViewController zu tun
quelle
Die Lösung von k06a ( https://github.com/k06a/ABStaticTableViewController ) ist besser, da sie den gesamten Abschnitt einschließlich der Kopf- und Fußzeilen der Zellen verbirgt, wobei diese Lösung ( https://github.com/peterpaulis/StaticDataTableViewController ) alles außer der Fußzeile verbirgt.
BEARBEITEN
Ich habe gerade eine Lösung gefunden, wenn Sie die Fußzeile verstecken möchten
StaticDataTableViewController
. Folgendes müssen Sie in die Datei StaticTableViewController.m kopieren:quelle
Sicher kannst du. Kehren Sie zunächst zu Ihrer tableView-Anzahl der Zellen zurück, die Sie anzeigen möchten, und rufen Sie dann
super
auf, um eine bestimmte Zelle aus Ihrem Storyboard zu erhalten, und geben Sie sie für tableView zurück:Wenn Ihre Zellen eine andere Höhe haben, geben Sie diese ebenfalls zurück:
quelle
Zusätzlich zur @ Saleh Masum-Lösung:
Wenn Sie Fehler beim automatischen Layout erhalten , können Sie die Einschränkungen einfach aus dem entfernen
tableViewCell.contentView
Swift 3:
Diese Lösung hängt vom Ablauf Ihrer App ab . Wenn Sie die Zelle in derselben View Controller-Instanz ein- / ausblenden möchten, ist dies möglicherweise nicht die beste Wahl, da dadurch die Einschränkungen aufgehoben werden .
quelle
Ich habe eine bessere Möglichkeit, statische Zellen und sogar Abschnitte dynamisch ohne Hacks auszublenden.
Wenn Sie die Zeilenhöhe auf 0 setzen, kann eine Zeile ausgeblendet werden. Dies funktioniert jedoch nicht, wenn Sie einen gesamten Abschnitt ausblenden möchten, der einige Leerzeichen enthält, selbst wenn Sie alle Zeilen ausblenden.
Mein Ansatz ist es, ein Abschnittsarray statischer Zellen zu erstellen. Dann wird der Inhalt der Tabellenansicht vom Abschnittsarray gesteuert.
Hier ist ein Beispielcode:
Auf diese Weise können Sie Ihren gesamten Konfigurationscode zusammenstellen, ohne den bösen Code schreiben zu müssen, um die Anzahl der Zeilen und Abschnitte zu berechnen. Und natürlich nein
0
Höhen mehr.Dieser Code ist auch sehr einfach zu pflegen. Zum Beispiel, wenn Sie weitere Zellen oder Abschnitte hinzufügen / entfernen möchten.
Ebenso können Sie ein Titelarray für Abschnittsüberschriften und ein Titelarray für Abschnittsfußzeilen erstellen, um Ihre Abschnittsüberschriften dynamisch zu konfigurieren.
quelle