wake-up-neo.com

Umgang mit einem leeren UITableView. Drucken Sie eine freundliche Nachricht

Ich habe eine UITableView, die es in einigen Fällen erlaubt, leer zu sein. Anstatt das Hintergrundbild der App anzuzeigen, würde ich lieber eine freundliche Nachricht auf dem Bildschirm ausgeben, z. B .:

Diese Liste ist jetzt leer

Was ist der einfachste Weg, dies zu tun?

104
cateof

Die backgroundView-Eigenschaft von UITableView ist Ihr Freund.

In viewDidLoad oder an einer beliebigen Stelle, an der Sie reloadData angeben, ob Ihre Tabelle leer ist oder nicht, müssen Sie 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 "Liste ist leer" -Zelle zurückzugeben. Plötzlich muss numberOfRowsInSection:(NSInteger)section die Anzahl der Zeilen anderer Abschnitte berechnen, nach denen nicht gefragt wurde, ob sie auch leer sind. Sie müssen auch eine spezielle Zelle erstellen, in der sich die leere Nachricht befindet. 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 auf Pflaster.

156
Ray Fix

Basierend auf den Antworten hier ist hier eine kurze Klasse, die ich erstellt habe und die Sie in Ihrem UITableViewController verwenden können.

import Foundation
import UIKit

class TableViewHelper {

    class func EmptyMessage(message:String, viewController:UITableViewController) {
        let rect = CGRect(Origin: CGPoint(x: 0,y :0), size: CGSize(width: self.view.bounds.size.width, height: self.view.bounds.size.height))
        let messageLabel = UILabel(frame: rect)
        messageLabel.text = message
        messageLabel.textColor = UIColor.blackColor()
        messageLabel.numberOfLines = 0;
        messageLabel.textAlignment = .Center;
        messageLabel.font = UIFont(name: "TrebuchetMS", size: 15)
        messageLabel.sizeToFit()

        viewController.tableView.backgroundView = messageLabel;
        viewController.tableView.separatorStyle = .None;
    }
}

In Ihrem UITableViewController können Sie dies in numberOfSectionsInTableView(tableView: UITableView) -> Int aufrufen.

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    if projects.count > 0 {
        return 1
    } else {
        TableViewHelper.EmptyMessage("You don't have any projects yet.\nYou can create up to 10.", viewController: self)
        return 0
    }
}

enter image description here

Mit ein wenig Hilfe von http://www.appcoda.com/pull-to-refresh-uitableview-empty/

80
Johnston

Das Gleiche wie Jhonstons Antwort, aber ich habe es als Erweiterung vorgezogen:

extension UITableView {

    func setEmptyMessage(_ message: String) {
        let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height))
        messageLabel.text = message
        messageLabel.textColor = .black
        messageLabel.numberOfLines = 0;
        messageLabel.textAlignment = .center;
        messageLabel.font = UIFont(name: "TrebuchetMS", size: 15)
        messageLabel.sizeToFit()

        self.backgroundView = messageLabel;
        self.separatorStyle = .none;
    }

    func restore() {
        self.backgroundView = nil
        self.separatorStyle = .singleLine
    }
}

Verwendung:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if things.count == 0 {
        self.tableView.setEmptyMessage("My Message")
    } else {
        self.tableView.restore()
    }

    return things.count
}
53
Frankie

Ich empfehle folgende Bibliothek: DZNEmptyDataSet

Der einfachste Weg, es zu Ihrem Projekt hinzuzufügen, besteht darin, es mit Cocaopods wie folgt zu verwenden: pod 'DZNEmptyDataSet'

Fügen Sie in Ihrem TableViewController die folgende Importanweisung (Swift) hinzu:

import DZNEmptyDataSet

Stellen Sie dann sicher, dass Ihre Klasse mit DNZEmptyDataSetSource und DZNEmptyDataSetDelegate übereinstimmt:

class MyTableViewController: UITableViewController, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate

Fügen Sie in Ihrem viewDidLoad die folgenden Codezeilen hinzu:

tableView.emptyDataSetSource = self
tableView.emptyDataSetDelegate = self
tableView.tableFooterView = UIView()

Jetzt müssen Sie nur noch Folgendes tun, um den leeren Zustand anzuzeigen:

//Add title for empty dataset
func titleForEmptyDataSet(scrollView: UIScrollView!) -> NSAttributedString! {
    let str = "Welcome"
    let attrs = [NSFontAttributeName: UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)]
    return NSAttributedString(string: str, attributes: attrs)
}

//Add description/subtitle on empty dataset
func descriptionForEmptyDataSet(scrollView: UIScrollView!) -> NSAttributedString! {
    let str = "Tap the button below to add your first grokkleglob."
    let attrs = [NSFontAttributeName: UIFont.preferredFontForTextStyle(UIFontTextStyleBody)]
    return NSAttributedString(string: str, attributes: attrs)
}

//Add your image
func imageForEmptyDataSet(scrollView: UIScrollView!) -> UIImage! {
    return UIImage(named: "MYIMAGE")
}

//Add your button 
func buttonTitleForEmptyDataSet(scrollView: UIScrollView!, forState state: UIControlState) -> NSAttributedString! {
    let str = "Add Grokkleglob"
    let attrs = [NSFontAttributeName: UIFont.preferredFontForTextStyle(UIFontTextStyleCallout)]
    return NSAttributedString(string: str, attributes: attrs)
}

//Add action for button
func emptyDataSetDidTapButton(scrollView: UIScrollView!) {
    let ac = UIAlertController(title: "Button tapped!", message: nil, preferredStyle: .Alert)
    ac.addAction(UIAlertAction(title: "Hurray", style: .Default, handler: nil))
    presentViewController(ac, animated: true, completion: nil)
}

Diese Methoden sind nicht obligatorisch, es ist auch möglich, nur den leeren Zustand ohne eine Schaltfläche usw. anzuzeigen.

Für Swift 4

// MARK: - Deal with the empty data set
// Add title for empty dataset
func title(forEmptyDataSet _: UIScrollView!) -> NSAttributedString! {
    let str = "Welcome"
    let attrs = [NSAttributedStringKey.font: UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)]
    return NSAttributedString(string: str, attributes: attrs)
}

// Add description/subtitle on empty dataset
func description(forEmptyDataSet _: UIScrollView!) -> NSAttributedString! {
    let str = "Tap the button below to add your first grokkleglob."
    let attrs = [NSAttributedStringKey.font: UIFont.preferredFont(forTextStyle: UIFontTextStyle.body)]
    return NSAttributedString(string: str, attributes: attrs)
}

// Add your image
func image(forEmptyDataSet _: UIScrollView!) -> UIImage! {
    return UIImage(named: "MYIMAGE")
}

// Add your button
func buttonTitle(forEmptyDataSet _: UIScrollView!, for _: UIControlState) -> NSAttributedString! {
    let str = "Add Grokkleglob"
    let attrs = [NSAttributedStringKey.font: UIFont.preferredFont(forTextStyle: UIFontTextStyle.callout), NSAttributedStringKey.foregroundColor: UIColor.white]
    return NSAttributedString(string: str, attributes: attrs)
}

// Add action for button
func emptyDataSetDidTapButton(_: UIScrollView!) {
    let ac = UIAlertController(title: "Button tapped!", message: nil, preferredStyle: .alert)
    ac.addAction(UIAlertAction(title: "Hurray", style: .default, handler: nil))
    present(ac, animated: true, completion: nil)
}
14
Hapeki

Eine Möglichkeit wäre, Ihre Datenquelle so zu ändern, dass 1, wenn die Anzahl der Zeilen Null ist, und um eine Spezialzelle (möglicherweise mit einem anderen Zellenbezeichner) im tableView:cellForRowAtIndexPath: Methode.

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSInteger actualNumberOfRows = <calculate the actual number of rows>;
    return (actualNumberOfRows  == 0) ? 1 : actualNumberOfRows;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger actualNumberOfRows = <calculate the actual number of rows>;
    if (actualNumberOfRows == 0) {
        // Produce a special cell with the "list is now empty" message
    }
    // Produce the correct cell the usual way
    ...
}

Dies kann etwas kompliziert werden, wenn Sie mehrere Table-View-Controller haben, die Sie warten müssen, da irgendwann jemand vergisst, einen Null-Check 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 es EmptyTableViewDataSource). Wenn sich die von Ihrem Table View Controller verwalteten Daten ändern, prüft der Code, der die Änderung verwaltet, ob die Daten leer sind. Wenn es nicht leer ist, stellen Sie Ihren Table View Controller auf die reguläre Datenquelle ein. Andernfalls legen Sie eine Instanz von EmptyTableViewDataSource fest, die mit der entsprechenden Nachricht konfiguriert wurde.

12
dasblinkenlight

Ich habe die titleForFooterInSection-Nachricht dafür verwendet. Ich weiß nicht, ob das suboptimal ist oder nicht, aber es funktioniert.

-(NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section   {

    NSString *message = @"";
    NSInteger numberOfRowsInSection = [self tableView:self.tableView numberOfRowsInSection:section ];

    if (numberOfRowsInSection == 0) {
        message = @"This list is now empty";
    }

    return message;
}
10
Carlos B

Also für eine sicherere Lösung:

extension UITableView {
func setEmptyMessage(_ message: String) {
    guard self.numberOfRows() == 0 else {
        return
    }
    let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height))
    messageLabel.text = message
    messageLabel.textColor = .black
    messageLabel.numberOfLines = 0;
    messageLabel.textAlignment = .center;
    messageLabel.font = UIFont.systemFont(ofSize: 14.0, weight: UIFontWeightMedium)
    messageLabel.sizeToFit()

    self.backgroundView = messageLabel;
    self.separatorStyle = .none;
}

func restore() {
    self.backgroundView = nil
    self.separatorStyle = .singleLine
}

public func numberOfRows() -> Int {
    var section = 0
    var rowCount = 0
    while section < numberOfSections {
        rowCount += numberOfRows(inSection: section)
        section += 1
    }
    return rowCount
  }
}

und auch für UICollectionView:

extension UICollectionView {
func setEmptyMessage(_ message: String) {
    guard self.numberOfItems() == 0 else {
        return
    }

    let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height))
    messageLabel.text = message
    messageLabel.textColor = .black
    messageLabel.numberOfLines = 0;
    messageLabel.textAlignment = .center;
    messageLabel.font = UIFont.systemFont(ofSize: 18.0, weight: UIFontWeightSemibold)
    messageLabel.sizeToFit()
    self.backgroundView = messageLabel;
}

func restore() {
    self.backgroundView = nil
}

public func numberOfItems() -> Int {
    var section = 0
    var itemsCount = 0
    while section < self.numberOfSections {
        itemsCount += numberOfItems(inSection: section)
        section += 1
    }
    return itemsCount
  }
}

Mehr generische Lösung:

    protocol EmptyMessageViewType {
      mutating func setEmptyMessage(_ message: String)
      mutating func restore()
    }

    protocol ListViewType: EmptyMessageViewType where Self: UIView {
      var backgroundView: UIView? { get set }
    }

    extension UITableView: ListViewType {}
    extension UICollectionView: ListViewType {}

    extension ListViewType {
      mutating func setEmptyMessage(_ message: String) {
        let messageLabel = UILabel(frame: CGRect(x: 0,
                                                 y: 0,
                                                 width: self.bounds.size.width,
                                                 height: self.bounds.size.height))
        messageLabel.text = message
        messageLabel.textColor = .black
        messageLabel.numberOfLines = 0
        messageLabel.textAlignment = .center
        messageLabel.font = UIFont(name: "TrebuchetMS", size: 16)
        messageLabel.sizeToFit()

        backgroundView = messageLabel
    }

     mutating func restore() {
        backgroundView = nil
     }
}
7
Meseery

Die Verwendung von backgroundView ist in Ordnung, aber der Bildlauf funktioniert nicht so gut wie in Mail.app.

Ich habe etwas Ähnliches getan wie xtravar .

Ich habe eine Ansicht außerhalb der Ansichtshierarchie von tableViewController hinzugefügt. hierarchy

Dann habe ich den folgenden Code in tableView:numberOfRowsInSection::

if someArray.count == 0 {
    // Show Empty State View
    self.tableView.addSubview(self.emptyStateView)
    self.emptyStateView.center = self.view.center
    self.emptyStateView.center.y -= 60 // rough calculation here
    self.tableView.separatorColor = UIColor.clear
} else if self.emptyStateView.superview != nil {
    // Empty State View is currently visible, but shouldn't
    self.emptyStateView.removeFromSuperview()
    self.tableView.separatorColor = nil
}

return someArray.count

Grundsätzlich habe ich das emptyStateView als Unteransicht des tableView Objekts hinzugefügt. Da die Separatoren die Ansicht überlappen würden, setze ich ihre Farbe auf clearColor. Um zur Standardtrennfarbe zurückzukehren, können Sie sie einfach auf nil setzen.

5
mangerlahn

Ich kann nur empfehlen, eine UITextView per Drag & Drop in die TableView nach den Zellen zu ziehen. Stellen Sie eine Verbindung zum ViewController her und blenden Sie ihn bei Bedarf aus/ein (z. B. beim erneuten Laden der Tabelle).

enter image description here

5
pasql

Die Verwendung eines Container View Controllers ist der richtige Weg, um dies gemäß Apple zu tun.

Ich habe alle meine leeren Statusansichten in einem separaten Storyboard abgelegt. Jede unter ihrer 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 diese übernimmt.
Dann müssen Sie nur noch den gewünschten Ansichtscontroller aus diesem Storyboard instanziieren, ihn als untergeordneten Ansichtscontroller hinzufügen und die Containeransicht der tableView-Hierarchie hinzufügen (Unteransicht). Ihre leere Statusansicht kann auch gescrollt werden, was sich gut anfühlt und es Ihnen ermöglicht, Pull zum Aktualisieren zu implementieren.

Lesen Kapitel 'Hinzufügen eines Child View Controllers zu Ihrem Inhalt' für Hilfe zur Implementierung.

Stellen Sie einfach sicher, dass Sie den untergeordneten Ansichtsrahmen auf (0, 0, tableView.frame.width, tableView.frame.height) Setzen, damit die Objekte richtig zentriert und ausgerichtet werden.

4
AmitP

Erstens die Probleme mit anderen populären Ansätzen.

BackgroundView

Die Hintergrundansicht ist nicht gut zentriert, wenn Sie den einfachen Fall verwenden, dass es sich um ein UILabel handelt.

Zellen, Kopf- oder Fußzeilen zum Anzeigen der Nachricht

Dies beeinträchtigt Ihren Funktionscode und führt seltsame Edge-Fälle ein. Wenn Sie Ihre Nachricht perfekt zentrieren möchten, erhöht dies die Komplexität.

Rolling your own table view controller

Sie verlieren integrierte Funktionen wie refreshControl und erfinden das Rad neu. Halten Sie sich an UITableViewController, um die besten Ergebnisse zu erzielen.

Hinzufügen von UITableViewController als untergeordneter Ansichtscontroller

Ich habe das Gefühl, dass Sie in iOS 7+ Probleme mit contentInset haben werden - und warum kompliziert?

Meine Lösung

Die beste Lösung, die ich mir ausgedacht habe (und dies ist zugegebenermaßen nicht ideal), besteht darin, eine spezielle Ansicht zu erstellen, die über einer Bildlaufansicht platziert werden kann und dementsprechend agiert. In iOS 7 wird dies mit contentInset-Wahnsinn natürlich kompliziert, aber es ist machbar.

Dinge, auf die Sie achten müssen:

  • tabellentrennzeichen werden irgendwann beim reloadData in den Vordergrund gerückt - dagegen müssen Sie sich schützen
  • contentInset/contentOffset - Beobachten Sie diese Schlüssel in Ihrer speziellen Ansicht
  • tastatur - Wenn Sie nicht möchten, dass die Tastatur im Weg ist, ist dies eine weitere Berechnung
  • autolayout - Sie können sich nicht auf Frame-Änderungen verlassen, um Ihre Ansicht zu positionieren

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.

3
xtravar

Dies ist die beste und einfachste Lösung.

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 60)];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 60)];
    label.text = @"This list is empty";
    label.center = self.view.center;
    label.textAlignment = NSTextAlignmentCenter;
    [view addSubview:label];

    self.tableView.backgroundView = view;
2
Rajesh

Nachricht für leere Liste anzeigen, ob ITableView oder ICollectionView.

extension UIScrollView {
    func showEmptyListMessage(_ message:String) {
        let rect = CGRect(Origin: CGPoint(x: 0,y :0), size: CGSize(width: self.bounds.size.width, height: self.bounds.size.height))
        let messageLabel = UILabel(frame: rect)
        messageLabel.text = message
        messageLabel.textColor = .black
        messageLabel.numberOfLines = 0
        messageLabel.textAlignment = .center
        messageLabel.font = UIFont.systemFont(ofSize: 15)
        messageLabel.sizeToFit()

        if let `self` = self as? UITableView {
            self.backgroundView = messageLabel
            self.separatorStyle = .none
        } else if let `self` = self as? UICollectionView {
            self.backgroundView = messageLabel
        }
    }
}

Verwendungen:

if cellsViewModels.count == 0 {
    self.tableView.showEmptyListMessage("No Product In List!")
}

ODER:

if cellsViewModels.count == 0 {
    self.collectionView?.showEmptyListMessage("No Product In List!")
}

Denken Sie daran: Vergessen Sie nicht, das Nachrichtenetikett zu entfernen, falls Daten nach der Aktualisierung eintreffen.

2
Gurjit Singh

Wählen Sie Ihre TableViewController-Szene im Storyboard

enter image description here

Drag & Drop von UIView Etikett mit Ihrer Nachricht hinzufügen (zB: Keine Daten)

enter image description here

erstellen Sie einen UIView-Ausgang (z. B. für yournoDataView) auf Ihrem TableViewController.

und in viewDidLoad

self.tableView.backgroundView = yourNoDataView

1
gaurav bhardwaj

Mit Swift 4.2

  func numberOfSections(in tableView: UITableView) -> Int
{
    var numOfSections: Int = 0
    if self.medArray.count > 0
    {
        tableView.separatorStyle = .singleLine
        numOfSections            = 1
        tableView.backgroundView = nil
    }
    else
    {
        let noDataLabel: UILabel  = UILabel(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: tableView.bounds.size.height))
        noDataLabel.text          = "No  Medicine available.Press + to add New Pills "
        noDataLabel.textColor     = UIColor.black
        noDataLabel.textAlignment = .center
        tableView.backgroundView  = noDataLabel
        tableView.separatorStyle  = .none
    }
    return numOfSections
}
1
M Murteza

Wahrscheinlich nicht die beste Lösung, aber ich habe dies getan, indem ich einfach eine Beschriftung am Ende meiner Tabelle angebracht habe und wenn die Zeilen = 0 sind, dann habe ich ihr einen Text zugewiesen. Ziemlich einfach und erreicht das, was Sie versuchen, mit ein paar Codezeilen.

Ich habe zwei Abschnitte in meiner Tabelle (Jobs und Schulen)

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if (jobs.count == 0 && schools.count == 0) {
        emptyLbl.text = "No jobs or schools"
    } else {
        emptyLbl.text = ""
    }
0
Zach

Ich habe ein paar Ä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 unten gezeigte Meldung ist:

extension UITableView {

    fileprivate func configureLabelLayout(_ messageLabel: UILabel) {
        messageLabel.translatesAutoresizingMaskIntoConstraints = false
        let labelTop: CGFloat = CGFloat(UIDevice.current.userInterfaceIdiom == .pad ? 25:15)
        messageLabel.topAnchor.constraint(equalTo: backgroundView?.topAnchor ?? NSLayoutAnchor(), constant: labelTop).isActive = true
        messageLabel.widthAnchor.constraint(equalTo: backgroundView?.widthAnchor ?? NSLayoutAnchor(), constant: -20).isActive = true
        messageLabel.centerXAnchor.constraint(equalTo: backgroundView?.centerXAnchor ?? NSLayoutAnchor(), constant: 0).isActive = true
    }

    fileprivate func configureLabel(_ message: String) {
        let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height))
        messageLabel.textColor = .black
        messageLabel.numberOfLines = 0
        messageLabel.textAlignment = .center
        let fontSize = CGFloat(UIDevice.current.userInterfaceIdiom == .pad ? 25:15)
        let font: UIFont = UIFont(name: "MyriadPro-Regular", size: fontSize) ?? UIFont()
        messageLabel.font = font
        messageLabel.text = message
        self.backgroundView = UIView()
        self.backgroundView?.addSubview(messageLabel)
        configureLabelLayout(messageLabel)
        self.separatorStyle = .none
    }

    func setEmptyMessage(_ message: String, _ isEmpty: Bool) {
        if isEmpty { // instead of making the check in every TableView DataSource in the project
            configureLabel(message)
        }
        else {
            restore()
        }

    }

    func restore() {
        self.backgroundView = nil
        self.separatorStyle = .singleLine
    }
}

Verwendung

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let message: String = "The list is empty."
        ticketsTableView.setEmptyMessage(message, tickets.isEmpty)
        return self.tickets.count
    }
0
Alsh compiler

Swift-Version, aber bessere und einfachere Form. ** 3.

Ich hoffe es dient deinem Zweck ......

In Ihrem UITableViewController.

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if searchController.isActive && searchController.searchBar.text != "" {
        if filteredContacts.count > 0 {
            self.tableView.backgroundView = .none;
            return filteredContacts.count
        } else {
            Helper.EmptyMessage(message: ConstantMap.NO_CONTACT_FOUND, viewController: self)
            return 0
        }
    } else {
        if contacts.count > 0 {
            self.tableView.backgroundView = .none;
            return contacts.count
        } else {
            Helper.EmptyMessage(message: ConstantMap.NO_CONTACT_FOUND, viewController: self)
            return 0
        }
    }
}

Helferklasse mit Funktion:

 /* Description: This function generate alert dialog for empty message by passing message and
           associated viewcontroller for that function
           - Parameters:
            - message: message that require for  empty alert message
            - viewController: selected viewcontroller at that time
         */
        static func EmptyMessage(message:String, viewController:UITableViewController) {
            let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: viewController.view.bounds.size.width, height: viewController.view.bounds.size.height))
            messageLabel.text = message
            let bubbleColor = UIColor(red: CGFloat(57)/255, green: CGFloat(81)/255, blue: CGFloat(104)/255, alpha :1)

            messageLabel.textColor = bubbleColor
            messageLabel.numberOfLines = 0;
            messageLabel.textAlignment = .center;
            messageLabel.font = UIFont(name: "TrebuchetMS", size: 18)
            messageLabel.sizeToFit()

            viewController.tableView.backgroundView = messageLabel;
            viewController.tableView.separatorStyle = .none;
        }
0

Der einfachste und schnellste Weg, dies zu tun, besteht darin, eine Beschriftung unter tableView auf den Seitenbereich zu ziehen. Erstellen Sie einen Ausgang 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) hinzufügen, um viewDidLoad () einer leeren Tabelle die Wahrnehmung zu verleihen, dass sie ausgeblendet ist, wenn die Tabellen- und Hintergrundansicht dieselbe Farbe haben.

0
yoamod