Wenn keine Ergebnisse in der Tabellenansicht angezeigt werden, wird auf dem Bildschirm „Keine Ergebnisse“ angezeigt

114

Ich habe eine tableview, bei der manchmal keine Ergebnisse aufgelistet werden können. Daher möchte ich etwas aufstellen, das "keine Ergebnisse" sagt, wenn keine Ergebnisse vorliegen (entweder eine Beschriftung oder eine Tabellenansichtszelle?).

Gibt es einen einfachsten Weg, dies zu tun?

Ich würde einen Versuch labelhinter dem tableviewdann versteckt eines der auf der Grundlage der Ergebnisse zwei, aber da ich mit einem gerade arbeitete TableViewControllerund keine normal ViewControllerIch bin nicht sicher , wie klug oder machbar , was ist.

Ich benutze Parseund unterklassifiziere auch als PFQueryTableViewController:

@interface TableViewController : PFQueryTableViewController

Ich kann zusätzliche Details angeben, lassen Sie es mich einfach wissen!

TableViewController Szene im Storyboard:

Geben Sie hier die Bildbeschreibung ein

EDIT: Per Midhun MP, hier ist der Code, den ich benutze

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSInteger numOfSections = 0;
    if ([self.stringArray count] > 0)
    {
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        numOfSections                 = 1;
        //yourTableView.backgroundView   = nil;
        self.tableView.backgroundView = nil;
    }
    else
    {
        UILabel *noDataLabel         = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height)];
        noDataLabel.text             = @"No data available";
        noDataLabel.textColor        = [UIColor blackColor];
        noDataLabel.textAlignment    = NSTextAlignmentCenter;
        //yourTableView.backgroundView = noDataLabel;
        //yourTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        self.tableView.backgroundView = noDataLabel;
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }

    return numOfSections;
}

Und hier ist die Ansicht, die ich bekomme, sie hat immer noch Trennlinien. Ich habe das Gefühl, dass dies eine kleine Änderung ist, bin mir aber nicht sicher, warum Trennlinien angezeigt werden.

Geben Sie hier die Bildbeschreibung ein

SRMR
quelle
Ich denke, der Trick bestand darin, eine leere Fußzeile in der Tabellenansicht einzurichten, um Linien zu entfernen.
Ben Sinclair
@Andy Was meinst du damit?
SRMR
Verwenden Sie nicht die zu dieser Frage hinzugefügte Lösung. Datenquellenmethoden für Tabellenansichten dürfen niemals mehr tun, als sie sollen. numberOfSectionssollte eine Zählung zurückgeben und das ist es. Gleiches gilt für numberOfRowsInSection. Diese können jederzeit mehrmals aufgerufen werden. Aktualisieren Sie niemals Ansichten oder Daten oder tun Sie nichts anderes, als eine Zählung zurückzugeben. Die Logik zum Aktualisieren von Ansichten darf niemals in diesen Methoden enthalten sein.
rmaddy

Antworten:

206

Sie können dies leicht erreichen, indem Sie die backgroundViewEigenschaft von verwenden UITableView.

Ziel c:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSInteger numOfSections = 0;
    if (youHaveData)
    {
        yourTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        numOfSections                = 1;
        yourTableView.backgroundView = nil;
    }
    else
    {   
        UILabel *noDataLabel         = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, yourTableView.bounds.size.width, yourTableView.bounds.size.height)];
        noDataLabel.text             = @"No data available";
        noDataLabel.textColor        = [UIColor blackColor];
        noDataLabel.textAlignment    = NSTextAlignmentCenter;
        yourTableView.backgroundView = noDataLabel;
        yourTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }

    return numOfSections;
}

Schnell:

func numberOfSections(in tableView: UITableView) -> Int
{
    var numOfSections: Int = 0
    if youHaveData
    {
        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 data available"
        noDataLabel.textColor     = UIColor.black
        noDataLabel.textAlignment = .center
        tableView.backgroundView  = noDataLabel
        tableView.separatorStyle  = .none
    }
    return numOfSections
}

Referenz UITableView-Klassenreferenz

backgroundView Eigentum

Die Hintergrundansicht der Tabellenansicht.

Erklärung

Schnell

var backgroundView: UIView?

Ziel c

@property(nonatomic, readwrite, retain) UIView *backgroundView

Diskussion

Die Hintergrundansicht einer Tabellenansicht wird automatisch an die Größe der Tabellenansicht angepasst. Diese Ansicht wird als Unteransicht der Tabellenansicht hinter allen Zellen-, Kopf- und Fußzeilenansichten platziert.

Sie müssen diese Eigenschaft auf Null setzen, um die Hintergrundfarbe der Tabellenansicht festzulegen.

Midhun MP
quelle
Danke für die Antwort! Bedeutet das, dass ich eine tableViewSteckdose brauche, damit ich das tun kann yourTableView.backgroundView? Ich benutze eine, TableViewControllerdeshalb habe ich momentan keine Steckdose dafür, deshalb frage ich mich.
SRMR
1
UITableViewControllerhat bereits eine Eigenschaft mit dem Namen, tableViewso dass Sie keine erstellen müssen
Cihan Tek
self.tableView
Verstanden
1
Korrektur. Bei weiteren Tests musste ich tatsächlich feststellen, dass die von mir erwähnte Zeile denselben Wert zurückgibt. numOfSections = 1. Wenn ich es auf Null setze und meine Tabellenansicht leer ist, funktioniert es, aber wenn ich eine Zelle erstelle und sie dann lösche, anstatt die Nachricht zu löschen und anzuzeigen, stürzt sie mit dem folgenden Fehler ab. *** Beenden der App aufgrund der nicht erfassten Ausnahme 'NSInternalInconsistencyException', Grund: 'Interner UITableView-Fehler: Es kann keine neue Abschnittszuordnung mit der alten Abschnittsanzahl: 1 und der neuen Abschnittsanzahl: 0 generiert werden.' Ich weiß nicht, warum die Rückgabe des gleichen Werts funktioniert, aber es funktioniert und funktioniert so, wie es sollte.
ChrisOSX
2
Verwenden Sie diese Lösung nicht. Datenquellenmethoden für Tabellenansichten dürfen niemals mehr tun, als sie sollen. numberOfSectionssollte eine Zählung zurückgeben und das ist es. Gleiches gilt für numberOfRowsInSection. Diese können jederzeit mehrmals aufgerufen werden. Aktualisieren Sie niemals Ansichten oder Daten oder tun Sie nichts anderes, als eine Zählung zurückzugeben. Die Logik zum Aktualisieren von Ansichten darf niemals in diesen Methoden enthalten sein.
rmaddy
106

Für Xcode 8.3.2 - Swift 3.1

Hier ist eine nicht so bekannte, aber unglaublich einfache Möglichkeit, einer leeren Tabellenansicht, die auf Xcode 7 zurückgeht, eine Ansicht "Keine Elemente" hinzuzufügen. Ich überlasse es Ihnen, die Logik zu steuern, mit der das hinzugefügt / entfernt wird Ansicht zur Hintergrundansicht der Tabelle, aber hier ist der Ablauf für und das Xcode (8.3.2) -Storyboard:

  1. Wählen Sie im Storyboard die Szene mit Ihrer Tabellenansicht aus.
  2. Ziehen Sie eine leere UIView in das "Scene Dock" dieser Szene

Geben Sie hier die Bildbeschreibung ein

  1. Fügen Sie der neuen Ansicht ein UILabel und alle Einschränkungen hinzu und erstellen Sie dann ein IBOutlet für diese Ansicht

Geben Sie hier die Bildbeschreibung ein

  1. Weisen Sie diese Ansicht der tableView.backgroundView zu

Geben Sie hier die Bildbeschreibung ein

  1. Seht die Magie!

Geben Sie hier die Bildbeschreibung ein

Letztendlich funktioniert dies immer dann, wenn Sie Ihrem Ansichts-Controller eine einfache Ansicht hinzufügen möchten, die nicht unbedingt sofort angezeigt werden soll, sondern auch keinen Code übergeben soll.

Paul Bonneville
quelle
1
Diese Technik funktioniert für alles, für das Sie eine einfache Ansicht benötigen. Ich habe es auch für benutzerdefinierte Tabellenabschnittsüberschriften verwendet. Sie können es wirklich für alles verwenden, für das Sie eine Ansicht benötigen. Verweisen Sie einfach über ein IBOutlet und fügen Sie es als Unteransicht hinzu, wo immer Sie eine benutzerdefinierte Ansicht benötigen.
Paul Bonneville
Wie @gmogames sagte, ist dies nach 2 Jahren IOS das erste Mal, dass man etwas über den Hintergrund von tableView weiß! danke Mann
Ali Adil
1
Danke dafür. Um es dort herauszubringen, musste ich tableView.separatorStyle = .none verwenden und die Größe der Standard-UIView ändern, um die Hintergrundansicht zu sehen. Ich benutze Xcode 9.4 mit Swift 4.
Hammad Tariq
Wie platzieren Sie die benutzerdefinierte Ansicht?
Nol4635
1
@ Nol4635 Im Fall des Hintergrunds der Tabellenansicht weisen Sie die als IBOutlet erstellte Ansicht einfach dem Hintergrund der Tabellenansicht zu. Wenn Sie die Ansicht nur einer anderen Ansicht hinzufügen möchten, können Sie sie einfach als Unteransicht hinzufügen. Sie müssen die Rahmenwerte festlegen, aber es ist wie in jeder anderen Ansicht.
Paul Bonneville
30

Schnelle Version des obigen Codes: -

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    var numOfSection: NSInteger = 0

    if CCompanyLogoImage.count > 0 {

        self.tableView.backgroundView = nil
        numOfSection = 1


    } else {

        var noDataLabel: UILabel = UILabel(frame: CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height))
        noDataLabel.text = "No Data Available"
        noDataLabel.textColor = UIColor(red: 22.0/255.0, green: 106.0/255.0, blue: 176.0/255.0, alpha: 1.0)
        noDataLabel.textAlignment = NSTextAlignment.Center
        self.tableView.backgroundView = noDataLabel

    }
    return numOfSection
}

Wenn Sie jedoch Informationen aus einem JSON laden, müssen Sie überprüfen, ob der JSON leer ist oder nicht. Wenn Sie also Code wie diesen eingeben, wird zunächst die Meldung "Keine Daten" angezeigt und verschwindet dann. Denn nach dem erneuten Laden der Daten in der Tabelle wird die Nachricht ausgeblendet. Sie können diesen Code also dort einfügen, wo JSON-Daten in ein Array geladen werden. SO :-

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1
}

func extract_json(data:NSData) {


    var error: NSError?

    let jsonData: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers , error: &error)
    if (error == nil) {
        if let jobs_list = jsonData as? NSArray
        {
            if jobs_list.count == 0 {

                var noDataLabel: UILabel = UILabel(frame: CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height))
                noDataLabel.text = "No Jobs Available"
                noDataLabel.textColor = UIColor(red: 22.0/255.0, green: 106.0/255.0, blue: 176.0/255.0, alpha: 1.0)
                noDataLabel.textAlignment = NSTextAlignment.Center
                self.tableView.backgroundView = noDataLabel

            }

            for (var i = 0; i < jobs_list.count ; i++ )
            {
                if let jobs_obj = jobs_list[i] as? NSDictionary
                {
                    if let vacancy_title = jobs_obj["VacancyTitle"] as? String
                    {
                        CJobTitle.append(vacancy_title)

                        if let vacancy_job_type = jobs_obj["VacancyJobType"] as? String
                        {
                            CJobType.append(vacancy_job_type)

                            if let company_name = jobs_obj["EmployerCompanyName"] as? String
                            {
                                CCompany.append(company_name)

                                    if let company_logo_url = jobs_obj["EmployerCompanyLogo"] as? String
                                    {
                                        //CCompanyLogo.append("http://google.com" + company_logo_url)

                                        let url = NSURL(string: "http://google.com" + company_logo_url )
                                        let data = NSData(contentsOfURL:url!)
                                        if data != nil {
                                            CCompanyLogoImage.append(UIImage(data: data!)!)
                                        }

                                        if let vacancy_id = jobs_obj["VacancyID"] as? String
                                        {
                                            CVacancyId.append(vacancy_id)

                                        }

                                    }

                            }

                        }
                    }
                }
            }
        }
    }
    do_table_refresh();


}

func do_table_refresh() {

    dispatch_async(dispatch_get_main_queue(), {
        self.tableView.reloadData()
        return
    })
}
Chathuranga Silva
quelle
Dies funktioniert sehr gut für die Anzeige der Beschriftung, wenn sich keine Daten in den Zeilen befinden. Wie kann man jedoch am besten umgehen, wenn Daten eingehen und self.tableView.reloadData()aufgerufen werden? Ich habe festgestellt, dass meine neuen Zeilen hinzugefügt werden, aber die werden noDataLabelimmer noch darunter angezeigt.
tylerSF
1
Wenn Ihr Array Element hat, setzen Sie einfach self.tableView.backgroundView = nil
Chathuranga Silva
if jobs_list.count == 0 {// oben angegebenen Code hinzufügen} else {self.tableView.backgroundView = nil}
Chathuranga Silva
perfekt. Das Hinzufügen self.tableView.backgroundView = nilin meiner if-Anweisung vor return jobs_list.count funktioniert gut. danke
tylerSF
Verwenden Sie in dieser Antwort nicht die erste Lösung. Datenquellenmethoden für Tabellenansichten dürfen niemals mehr tun, als sie sollen. numberOfSectionssollte eine Zählung zurückgeben und das ist es. Gleiches gilt für numberOfRowsInSection. Diese können jederzeit mehrmals aufgerufen werden. Aktualisieren Sie niemals Ansichten oder Daten oder tun Sie nichts anderes, als eine Zählung zurückzugeben. Die Logik zum Aktualisieren von Ansichten darf niemals in diesen Methoden enthalten sein.
rmaddy
6

Sie können dieses Steuerelement ausprobieren. Es ist ziemlich ordentlich. DZNEmptyDataSet

Oder wenn ich du wäre, würde ich nur tun

  • Überprüfen Sie, ob Ihr Datenarray leer ist
  • Wenn es leer ist, fügen Sie ein Objekt mit dem Namen @ "No Data" hinzu
  • Zeigen Sie diese Zeichenfolge in cell.textLabel.text an

Kinderleicht

Sam B.
quelle
5

Swift 3 (aktualisiert):

override func numberOfSections(in tableView: UITableView) -> Int {
    if myArray.count > 0 {
        self.tableView.backgroundView = nil
        self.tableView.separatorStyle = .singleLine
        return 1
    }

    let rect = CGRect(x: 0,
                      y: 0,
                      width: self.tableView.bounds.size.width,
                      height: self.tableView.bounds.size.height)
    let noDataLabel: UILabel = UILabel(frame: rect)

    noDataLabel.text = "Custom message."
    noDataLabel.textColor = UIColor.white
    noDataLabel.textAlignment = NSTextAlignment.center
    self.tableView.backgroundView = noDataLabel
    self.tableView.separatorStyle = .none

    return 0
}
Teodor Ciuraru
quelle
Verwenden Sie diese Lösung nicht. Datenquellenmethoden für Tabellenansichten dürfen niemals mehr tun, als sie sollen. numberOfSectionssollte eine Zählung zurückgeben und das ist es. Gleiches gilt für numberOfRowsInSection. Diese können jederzeit mehrmals aufgerufen werden. Aktualisieren Sie niemals Ansichten oder Daten oder tun Sie nichts anderes, als eine Zählung zurückzugeben. Die Logik zum Aktualisieren von Ansichten darf niemals in diesen Methoden enthalten sein.
rmaddy
Genau. Diese Lösung kann verbessert, aber auch verwendet werden.
Teodor Ciuraru
Wie können Sie zustimmen, dass Sie diese Lösung nicht verwenden sollten, sondern dann angeben, dass sie auch verwendet werden kann? Das ist ein Widerspruch.
rmaddy
Ich bin damit einverstanden, dass diese Lösung verbessert werden kann, aber im aktuellen Zustand auch funktionieren wird.
Teodor Ciuraru
5

Swift3.0

Ich hoffe, es dient Ihrem 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;
        }
Ravindra Shekhawat
quelle
Verwenden Sie diese Lösung nicht. Datenquellenmethoden für Tabellenansichten dürfen niemals mehr tun, als sie sollen. numberOfSectionssollte eine Zählung zurückgeben und das ist es. Gleiches gilt für numberOfRowsInSection. Diese können jederzeit mehrmals aufgerufen werden. Aktualisieren Sie niemals Ansichten oder Daten oder tun Sie nichts anderes, als eine Zählung zurückzugeben. Die Logik zum Aktualisieren von Ansichten darf niemals in diesen Methoden enthalten sein.
rmaddy
3

Ich denke, der eleganteste Weg, um Ihr Problem zu lösen, ist der Wechsel von a UITableViewControllerzu a UIViewController, der a enthält UITableView. Auf diese Weise können Sie beliebige UIViewUnteransichten der Hauptansicht hinzufügen .

Ich würde nicht empfehlen, eine UITableViewCell zu verwenden, um dies zu tun. Möglicherweise müssen Sie in Zukunft zusätzliche Dinge hinzufügen, und die Dinge können schnell hässlich werden.

Sie können auch so etwas tun, aber dies ist auch nicht die beste Lösung.

UIWindow* window = [[UIApplication sharedApplication] keyWindow];
[window addSubview: OverlayView];
Cihan Tek
quelle
Vielen Dank für die Farbe, die am elegantesten zu implementieren ist, immer eine gute Möglichkeit, darüber nachzudenken. Ich könnte versuchen, mein Storyboard so zu ändern, dass es ein UIViewControllerenthält , das a enthält UITableView.
SRMR
1
Das ist der zukunftssicherste Weg. Ich habe selbst noch nie einen benutzt UITableViewController, weil es nicht viel einfacher ist, es anders zu machen, als es andersherum zu tun, aber es schränkt Ihre Fähigkeit ein, Dinge in Zukunft zu ändern.
Cihan Tek
Dies ist nicht zukunftssicher, wenn Sie durchscheinende Balken haben. Ich kann es nur empfehlen. Erstellen Sie zumindest einen UIViewController, der einen UITableViewController enthält und die Einstellungen entsprechend anpasst.
Xtravar
3

Verwenden Sie diesen Code in Ihrer numberOfSectionsInTableViewMethode: -

if ([array count]==0
{

    UILabel *fromLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, self.view.frame.size.height/2, 300, 60)];                                                                                        
    fromLabel.text =@"No Result";
    fromLabel.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
    fromLabel.backgroundColor = [UIColor clearColor];
    fromLabel.textColor = [UIColor lightGrayColor];
    fromLabel.textAlignment = NSTextAlignmentLeft;
    [fromLabel setFont:[UIFont fontWithName:Embrima size:30.0f]];
    [self.view addSubview:fromLabel];
    [self.tblView setHidden:YES];
}
Chandan
quelle
1
Verwenden Sie diese Lösung nicht. Datenquellenmethoden für Tabellenansichten dürfen niemals mehr tun, als sie sollen. numberOfSectionssollte eine Zählung zurückgeben und das ist es. Gleiches gilt für numberOfRowsInSection. Diese können jederzeit mehrmals aufgerufen werden. Aktualisieren Sie niemals Ansichten oder Daten oder tun Sie nichts anderes, als eine Zählung zurückzugeben. Die Logik zum Aktualisieren von Ansichten darf niemals in diesen Methoden enthalten sein.
rmaddy
2

SWIFT 3

        let noDataLabel: UILabel     = UILabel(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: tableView.bounds.size.height))
        noDataLabel.text             = "No data available"
        noDataLabel.textColor        = UIColor.white
        noDataLabel.font             = UIFont(name: "Open Sans", size: 15)
        noDataLabel.textAlignment    = .center
        tableView.backgroundView = noDataLabel
        tableView.separatorStyle = .none
Ahmed Safadi
quelle
2

Wenn Sie die Tabellenansichtsfußzeile nicht verwenden und nicht möchten, dass die Tabellenansicht den Bildschirm mit leeren Standardtabellenzellen ausfüllt, würde ich vorschlagen, dass Sie Ihre Tabellenansichtsfußzeile auf eine leere UIView setzen. Ich kenne nicht die richtige Syntax dafür in obj-c oder Swift, aber in Xamarin.iOS würde ich es so machen:

public class ViewController : UIViewController
{
    UITableView _table;

    public ViewController (IntPtr handle) : base (handle)
    {
    }

    public override void ViewWillAppear(bool animated) {
        // Initialize table

        _table.TableFooterView = new UIView();
    }
}

Der obige Code führt zu einer Tabellenansicht ohne die leeren Zellen

frmi
quelle
2

Hier ist die Lösung, die für mich funktioniert hat.

  1. Fügen Sie einer neuen Datei den folgenden Code hinzu.

  2. Ändern Sie Ihre Tabellenklasse aus Storyboard oder .xib in die benutzerdefinierte Klasse "MyTableView"

(Dies funktioniert nur für den ersten Abschnitt. Wenn Sie weitere Anpassungen vornehmen möchten, nehmen Sie Änderungen an der Funktion MyTableView reloadData () für andere Abschnitte entsprechend vor.)

public class MyTableView: UITableView {

    override public func reloadData() {
        super.reloadData()

        if self.numberOfRows(inSection: 0) == 0 {
            if self.viewWithTag(1111) == nil {
                let noDataLabel = UILabel()
                noDataLabel.textAlignment = .center
                noDataLabel.text = "No Data Available"
                noDataLabel.tag = 1111
                noDataLabel.center = self.center
                self.backgroundView = noDataLabel
            }

        } else {
            if self.viewWithTag(1111) != nil {
                self.backgroundView = nil
            }
        }
    }
}
ShrikantWalekar
quelle
Dies ist ein guter Ansatz. Ich habe einige Verbesserungen hinzugefügt, um es runder zu machen. 1. Zwischenspeichern Sie den Trennzeichenstil der Tabellenansicht und stellen Sie ihn beim Übergang vom leeren zum nicht leeren Zustand wieder her, damit diese Unterklasse für Anwendungsfälle anwendbar ist, bei denen unterschiedliche Trennzeichenstile gewünscht werden. 2. Fügen Sie @IBInspectable var emptyStateText: String?diese Klasse hinzu und markieren @IBDesignableSie sie, da Sie dann verschiedene leere Statustexte für verschiedene Szenen in Storyboard oder Xibs ändern können. Genießen! :)
Egist Li
1

Ich würde eine Überlagerungsansicht präsentieren, die das gewünschte Aussehen und die gewünschte Nachricht hat, wenn die Tabellenansicht keine Ergebnisse liefert. Sie können dies in ViewDidAppear tun, damit Sie die Ergebnisse erhalten, bevor Sie die Ansicht anzeigen / nicht anzeigen.

Siriss
quelle
1

Wenn Sie dies ohne Code tun möchten, versuchen Sie dies!

Klicken Sie auf Ihre tableView.

tableView Screenshot

Ändern Sie den Stil von "normal" in "gruppiert".

Screenshot-2 der Eigenschaften der Tabellenansicht

Jetzt, wenn Sie verwenden ....

tableView.backgroundView = EINFÜGEN IHRES ETIKETTES ODER IHRER ANSICHT

Die Trennzeichen werden nicht angezeigt!

F. Morales
quelle
1

Fügen Sie diesen Code in eine Datei ein und ändern Sie Ihren Sammlungstyp in CustomCollectionView

import Foundation

class CustomCollectionView: UICollectionView {

  var emptyModel = EmptyMessageModel()
  var emptyView: EmptyMessageView?
  var showEmptyView: Bool = true

  override func reloadData() {
    super.reloadData()

    emptyView?.removeFromSuperview()
    self.backgroundView = nil

    if !showEmptyView {
      return
    }

    if numberOfSections < 1 {
      let rect = CGRect(x: 0,
                        y: 0,
                        width: self.bounds.size.width,
                        height: self.bounds.size.height)

      emptyView = EmptyMessageView()
      emptyView?.frame = rect
      if let emptyView = emptyView {
        //                self.addSubview(emptyView)
        self.backgroundView = emptyView
      }
      emptyView?.setView(with: emptyModel)

    } else {
      emptyView?.removeFromSuperview()
      self.backgroundView = nil
    }
  }
}

class EmptyMessageView: UIView {

  @IBOutlet weak var messageLabel: UILabel!
  @IBOutlet weak var imageView: UIImageView!

  var view: UIView!

  override init(frame: CGRect) {
    super.init(frame: frame)
    xibSetup()
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    xibSetup()
  }

  func xibSetup() {
    view = loadViewFromNib()

    view.frame = bounds

    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    addSubview(view)
  }

  func loadViewFromNib() -> UIView {

    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: "EmptyMessageView", bundle: bundle)
    let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

    return view
  }

  func setView(with model: EmptyMessageModel) {
    messageLabel.text = model.message ?? ""
    imageView.image = model.image ?? #imageLiteral(resourceName: "no_notification")
  }
}

///////////
class EmptyMessageModel {
  var message: String?
  var image: UIImage?

  init(message: String = "No data available", image: UIImage = #imageLiteral(resourceName: "no_notification")) {
    self.message = message
    self.image = image
  }
}
ShrikantWalekar
quelle