webentwicklung-frage-antwort-db.com.de

Wenn keine Ergebnisse in der Tabellenansicht angezeigt werden, zeigen Sie auf dem Bildschirm "Keine Ergebnisse" an

Ich habe ein tableview, in dem manchmal keine Ergebnisse aufgelistet werden können. Ich möchte etwas ausdrücken, das "keine Ergebnisse" sagt wenn es keine Ergebnisse gibt (entweder a label oder eine Tabellenzelle?).

Gibt es einen einfachsten Weg, dies zu tun?

Ich würde versuchen, ein label hinter dem tableview zu verstecken und dann eines der beiden anhand der Ergebnisse auszublenden, aber da ich mit einem TableViewController und kein normaler ViewController Ich bin mir nicht sicher, wie schlau oder machbar das ist.

Ich verwende auch Parse und Unterklassen als PFQueryTableViewController:

@interface TableViewController : PFQueryTableViewController

Ich kann zusätzliche Informationen zur Verfügung stellen, lass es mich einfach wissen!

TableViewController Szene im Storyboard:

enter image description here

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, es hat immer noch Trennlinien. Ich habe das Gefühl, dass es sich um eine kleine Änderung handelt, bin mir aber nicht sicher, warum Trennlinien angezeigt werden?

enter image description here

105
SRMR

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

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;
}

Swift:

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 ITableView-Klassenreferenz

backgroundView Eigenschaft

Die Hintergrundansicht der Tabellenansicht.

Erklärung

Swift

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.

196
Midhun MP

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 "Keine Elemente" -Ansicht hinzuzufügen Ansicht zur Hintergrundansicht der Tabelle, aber hier ist das Ablauf- und 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

enter image description here

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

enter image description here

  1. Weisen Sie diese Ansicht der Datei tableView.backgroundView zu

enter image description here

  1. Seht die Magie!

enter image description here

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

94
Paul Bonneville

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 Code wie diesen eingeben, wird anfangs die Meldung "Keine Daten" angezeigt, und die Meldung wird ausgeblendet. Denn nach dem erneuten Laden der Tabelle wird die Meldung ausgeblendet. Sie können diesen Code also dort ablegen, 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
    })
}
30

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

Oder wenn ich Sie wäre, wäre alles, was ich tun würde

  • Ü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 diesen String in cell.textLabel.text an

Kinderleicht

7
Sam B

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
}
5
Teodor Ciuraru

Swift3.

Ich hoffe es dient deinem Zweck ...... In deinem 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;
        }
5

Ich denke, die eleganteste Art, Ihr Problem zu lösen, besteht darin, von einem UITableViewController zu einem UIViewController zu wechseln, der einen UITableView enthält. Auf diese Weise können Sie beliebige UIView als Unteransichten 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 es kann 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];
3
Cihan Tek

Verwenden Sie diesen Code in Ihrer numberOfSectionsInTableView Methode: -

if ([array count]==0
{

    UILabel *fromLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, self.view.frame.size.height/2, 300, 60)];                                                                                        
    fromLabel.text [email protected]"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];
}
3
Chandan

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 in die benutzerdefinierte Klasse "MyTableView" aus Storyboard oder .xib

(Dies funktioniert nur im ersten Abschnitt. Wenn Sie weitere Anpassungen vornehmen möchten, nehmen Sie die entsprechenden Änderungen in der Funktion MyTableView reloadData () für andere Abschnitte 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
            }
        }
    }
}
2
ShrikantWalekar

Schnell 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
2
Ahmed Safadi

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".

Table View properties screenshot-2

Jetzt wenn du benutzt ....

tableView.backgroundView = IHR ETIKETT EINFÜGEN OR VIEW

Die Trennzeichen werden nicht angezeigt!

1
F. Morales

Wenn Sie die Fußzeile der Tabellenansicht nicht verwenden und nicht möchten, dass die Tabellenansicht den Bildschirm mit leeren Standardtabellenzellen füllt, würde ich vorschlagen, dass Sie die Fußzeile der Tabellenansicht auf eine leere UIView setzen. Ich kenne nicht die richtige Syntax, um dies in obj-c oder Swift zu tun, 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 leere Zellen

1
frmi

Ich würde eine Overlay-Ansicht mit dem gewünschten Aussehen und der gewünschten Meldung anzeigen, wenn die Tabellenansicht keine Ergebnisse liefert. Sie können dies in ViewDidAppear tun, sodass Sie die Ergebnisse haben, bevor Sie die Ansicht anzeigen/nicht anzeigen.

1
Siriss

Fügen Sie diesen Code in einer Datei hinzu 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
  }
}
1
ShrikantWalekar