Ich habe eine UITableView, dass es in einigen Fällen legal ist, leer zu sein. Anstatt das Hintergrundbild der App anzuzeigen, möchte ich lieber eine freundliche Nachricht auf dem Bildschirm drucken, z. B.:
Diese Liste ist jetzt leer
Was ist der einfachste Weg, dies zu tun?
iphone
ios
uitableview
uiview
cateof
quelle
quelle
Antworten:
Die backgroundView-Eigenschaft von UITableView ist Ihr Freund.
An
viewDidLoad
oder an einer beliebigen StellereloadData
sollten Sie feststellen, ob Ihre Tabelle leer ist oder nicht, und die backgroundView-Eigenschaft von UITableView mit einer UIView aktualisieren, die ein UILabel enthält, oder sie einfach auf Null setzen. Das ist es.Es ist natürlich möglich, die Datenquelle von UITableView zu einer doppelten Aufgabe zu machen und eine spezielle Zelle "Liste ist leer" zurückzugeben, was mir als Kludge erscheint. Plötzlich
numberOfRowsInSection:(NSInteger)section
muss die Anzahl der Zeilen anderer Abschnitte berechnet werden, nach denen nicht gefragt wurde, um sicherzustellen, dass sie auch leer sind. Sie müssen auch eine spezielle Zelle erstellen, die die leere Nachricht enthält. Vergessen Sie auch nicht, dass Sie wahrscheinlich die Höhe Ihrer Zelle ändern müssen, um die leere Nachricht aufzunehmen. Das ist alles machbar, aber es scheint wie Pflaster zusätzlich zu Pflaster.quelle
backgroundView
versteckten Eigenschaften ist der richtige Weg. MitDZNEmptyDataSet
müssen wir seineemptyDataSetSource
tableView.backgroundView!.userInteraction = true
Nach der Zeile, die Sie festgelegt habentableView.backgroundView = constructMyViewWithButtons()
, oder wie auch immer Sie sie festlegen.Wie Jhonstons Antwort, aber ich habe es als Erweiterung vorgezogen:
Verwendung:
quelle
func numberOfSections(in tableView: UITableView) -> Int
Methode verschiebenBasierend auf den Antworten hier ist hier eine kurze Klasse, die ich gemacht habe und die Sie in Ihrem verwenden können
UITableViewController
.In Ihrem können
UITableViewController
Sie dies anrufennumberOfSectionsInTableView(tableView: UITableView) -> Int
Mit ein wenig Hilfe von http://www.appcoda.com/pull-to-refresh-uitableview-empty/
quelle
viewController.tableView.separatorStyle = .none
ist nicht erforderlich.Ich empfehle die folgende Bibliothek: DZNEmptyDataSet
Der einfachste Weg, es in Ihr Projekt einzufügen, besteht darin, es mit Cocaopods wie folgt zu verwenden:
pod 'DZNEmptyDataSet'
Fügen Sie in Ihrem TableViewController die folgende Importanweisung (Swift) hinzu:
Dann stellen Sie sicher , Ihre Klasse entspricht den
DNZEmptyDataSetSource
und inDZNEmptyDataSetDelegate
etwa so:Fügen
viewDidLoad
Sie in Ihrem Code die folgenden Codezeilen hinzu:Jetzt müssen Sie nur noch Folgendes tun, um den Emptystate anzuzeigen:
Diese Methoden sind nicht obligatorisch, es ist auch möglich, nur den leeren Zustand ohne Schaltfläche usw. anzuzeigen.
Für Swift 4
quelle
Eine Möglichkeit besteht darin, Ihre Datenquelle so zu ändern, dass sie zurückkehrt,
1
wenn die Anzahl der Zeilen Null ist, und in dertableView:cellForRowAtIndexPath:
Methode eine Spezialzelle (möglicherweise mit einer anderen Zellkennung) zu erstellen .Dies kann etwas kompliziert werden, wenn Sie mehrere Controller für Tabellenansichten haben, die Sie warten müssen, da jemand irgendwann vergisst, eine Nullprüfung einzufügen. Ein besserer Ansatz besteht darin, eine separate Implementierung einer
UITableViewDataSource
Implementierung zu erstellen , die immer eine einzelne Zeile mit einer konfigurierbaren Nachricht zurückgibt (nennen wir esEmptyTableViewDataSource
). Wenn sich die Daten ändern, die von Ihrem Table View Controller verwaltet werden, prüft der Code, der die Änderung verwaltet, ob die Daten leer sind. Wenn es nicht leer ist, legen Sie Ihren Table View Controller mit seiner regulären Datenquelle fest. Andernfalls legen Sie eine Instanz fest, dieEmptyTableViewDataSource
mit der entsprechenden Nachricht konfiguriert wurde.quelle
deleteRowsAtIndexPaths:withRowAnimation:
da die von zurückgegebene NummernumberOfRowsInSection
mit dem Ergebnis von $ numRows - $ rowsDeleted übereinstimmen muss.Ich habe dafür die titleForFooterInSection-Nachricht verwendet. Ich weiß nicht, ob dies nicht optimal ist oder nicht, aber es funktioniert.
quelle
return tableView.numberOfRowsInSection(section) == 0 ? "This list is now empty" : nil
Für eine sicherere Lösung:
und auch für
UICollectionView
:Generischere Lösung:
quelle
Ich kann nur empfehlen, eine UITextView in die TableView nach den Zellen zu ziehen und dort abzulegen. Stellen Sie eine Verbindung zum ViewController her und blenden Sie ihn gegebenenfalls aus / ein (z. B. wenn die Tabelle neu geladen wird).
quelle
Die Verwendung von backgroundView ist in Ordnung, führt jedoch keinen guten Bildlauf wie in Mail.app durch.
Ich habe etwas ähnliches gemacht wie xtravar .
Ich habe eine Ansicht außerhalb der Ansichtshierarchie des hinzugefügt
tableViewController
.Dann habe ich folgenden Code verwendet
tableView:numberOfRowsInSection:
:Grundsätzlich habe ich das
emptyStateView
als Unteransicht destableView
Objekts hinzugefügt . Da die Trennzeichen die Ansicht überlappen würden, habe ich ihre Farbe auf eingestelltclearColor
. Um zur Standardtrennfarbe zurückzukehren, können Sie sie einfach auf einstellennil
.quelle
tableHeaderView
und sicherzustellen, dass es die Größe anpasst .Laut Apple ist die Verwendung eines Container View Controllers der richtige Weg, dies zu tun .
Ich habe alle meine leeren Statusansichten in einem separaten Storyboard abgelegt. Jedes unter seiner eigenen UIViewController-Unterklasse. Ich füge Inhalte direkt unter ihrer Stammansicht hinzu. Wenn eine Aktion / Schaltfläche erforderlich ist, haben Sie jetzt bereits einen Controller, der dies erledigt.
Dann müssen Sie nur noch den gewünschten Ansichts-Controller von diesem Storyboard aus instanziieren, ihn als untergeordneten Ansichts-Controller hinzufügen und die Container-Ansicht zur Hierarchie der tableView (Unteransicht) hinzufügen. Ihre leere Statusansicht kann ebenfalls gescrollt werden, was sich gut anfühlt und es Ihnen ermöglicht, Pull zum Aktualisieren zu implementieren.
Lesen Sie das Kapitel "Hinzufügen eines untergeordneten View Controllers zu Ihren Inhalten", um Hilfe zur Implementierung zu erhalten.
Stellen Sie einfach sicher, dass Sie den untergeordneten Ansichtsrahmen so einstellen, dass die
(0, 0, tableView.frame.width, tableView.frame.height)
Dinge zentriert und richtig ausgerichtet werden.quelle
Erstens die Probleme mit anderen populären Ansätzen.
Hintergrundansicht
Die Hintergrundansicht ist nicht gut zentriert, wenn Sie den einfachen Fall verwenden, sie als UILabel festzulegen.
Zellen, Kopf- oder Fußzeilen, um die Nachricht anzuzeigen
Dies stört Ihren Funktionscode und führt zu seltsamen Randfällen. Wenn Sie Ihre Nachricht perfekt zentrieren möchten, erhöht dies die Komplexität.
Rollen Sie Ihren eigenen Table View Controller
Sie verlieren integrierte Funktionen wie refreshControl und erfinden das Rad neu. Halten Sie sich an UITableViewController, um die bestmöglichen Ergebnisse zu erzielen.
Hinzufügen von UITableViewController als untergeordneten Ansichtscontroller
Ich habe das Gefühl, dass Sie in iOS 7+ Probleme mit contentInset haben werden - und warum die Dinge komplizieren?
Meine Lösung
Die beste Lösung, die ich mir ausgedacht habe (und die natürlich nicht ideal ist), besteht darin, eine spezielle Ansicht zu erstellen, die auf einer Bildlaufansicht sitzen und entsprechend handeln kann. In iOS 7 wird dies mit contentInset-Wahnsinn offensichtlich kompliziert, aber es ist machbar.
Dinge, auf die Sie achten müssen:
Sobald Sie dies einmal in einer UIView-Unterklasse herausgefunden haben, können Sie es für alles verwenden - Laden von Spinnern, Deaktivieren von Ansichten, Anzeigen von Fehlermeldungen usw.
quelle
addSubView
sie an die Tabellenansicht angehängt, was immer Probleme mit dem automatischen Layout verursacht.Dies ist die beste und einfachste Lösung.
quelle
Nachricht für leere Liste anzeigen, ob UITableView oder UICollectionView .
Verwendung:
ODER:
Denken Sie daran: Vergessen Sie nicht, das Nachrichtenetikett zu entfernen, falls die Daten nach der Aktualisierung eingehen.
quelle
Wählen Sie Ihre tableviewController-Szene im Storyboard aus
Drag & Drop UIView Beschriftung mit Ihrer Nachricht hinzufügen (z. B. Keine Daten)
Erstellen Sie einen UIView-Ausgang (z. B. für yournoDataView) auf Ihrem TableViewController.
und in viewDidLoad
self.tableView.backgroundView = yourNoDataView
quelle
Verwenden von Swift 4.2
quelle
Sie können dies Ihrer Basisklasse hinzufügen.
Zeigen Sie es so in der Klasse, wenn Sie die Daten von der API erhalten.
Verstecke es so.
quelle
Schnelle Version, aber bessere und einfachere Form. ** 3.0
Ich hoffe es dient Ihrem Zweck ......
In Ihrem UITableViewController.
Helferklasse mit Funktion:
quelle
Wahrscheinlich nicht die beste Lösung, aber ich habe dies getan, indem ich einfach eine Beschriftung am Ende meiner Tabelle eingefügt habe und wenn die Zeilen = 0 sind, habe ich ihr Text zugewiesen. Ziemlich einfach und erreicht das, was Sie versuchen, mit ein paar Codezeilen.
Ich habe zwei Abschnitte in meiner Tabelle (Jobs und Schulen)
quelle
Der einfachste und schnellste Weg, dies zu tun, besteht darin, eine Beschriftung auf das Seitenfenster unter tableView zu ziehen. Erstellen Sie eine Steckdose für das Label und die tableView und fügen Sie eine if-Anweisung hinzu, um das Label und die Tabelle nach Bedarf auszublenden und anzuzeigen. Alternativ können Sie tableView.tableFooterView = UIView (frame: CGRect.zero) zu viewDidLoad () hinzufügen, um einer leeren Tabelle die Wahrnehmung zu geben, dass sie ausgeblendet ist, wenn die Tabellen- und Hintergrundansicht dieselbe Farbe haben.
quelle
Ich habe einige Änderungen vorgenommen, damit wir die Anzahl nicht manuell überprüfen müssen. Außerdem habe ich Einschränkungen für das Etikett hinzugefügt, damit nichts schief geht, egal wie groß die Nachricht ist (siehe unten):
Verwendung
quelle
Alternativ können Sie eine leicht anpassbare, leichte Bibliothek verwenden
SwiftEmptyState
quelle