如果没有表格视图结果,则在屏幕上显示“无结果”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果没有表格视图结果,则在屏幕上显示“无结果”相关的知识,希望对你有一定的参考价值。

我有一个tableview,有时可能没有任何结果列出,所以如果没有结果(标签或一个表视图单元?),我想提出一些说“没有结果”的东西。

有最简单的方法吗?

我会尝试在label背后的tableview,然后根据结果隐藏其中一个,但因为我正在使用TableViewController而不是正常的ViewController,我不确定这是多么聪明或可行。

我也使用Parse和子类作为PFQueryTableViewController

@interface TableViewController : PFQueryTableViewController

我可以提供所需的任何其他详细信息,请告诉我!

故事板中的TableViewController场景:

编辑:Per Midhun MP,这是我正在使用的代码

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

这是我得到的视图,它仍然有分隔线。我觉得这是一个小小的变化,但我不确定为什么分隔线会出现?

答案

您可以使用backgroundViewUITableView属性轻松实现这一目标。

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

迅速:

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
}

参考UITableView Class Reference

backgroundView财产

表视图的背景视图。

Declaration

迅速

var backgroundView: UIView?

Objective-C的

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

Discussion

表视图的背景视图会自动调整大小以匹配表视图的大小。此视图作为所有单元格,页眉视图和页脚视图后面的表视图的子视图放置。

必须将此属性设置为nil才能设置表视图的背景颜色。

另一答案

这是适合我的解决方案。

  1. 将以下代码添加到新文件中。
  2. 从storyboard或.xib将您的表类更改为自定义类“MyTableView”

(这仅适用于第一部分。如果要自定义更多,请相应地对其他部分进行MyTableView reloadData()函数的更改)

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
            }
        }
    }
}
另一答案

如果tableview没有结果,我会提供一个覆盖视图,其中包含您想要的外观和消息。您可以在ViewDidAppear中执行此操作,因此您可以在显示/不显示视图之前获得结果。

另一答案

如果您不使用tableview页脚并且不希望tableview用空的默认表格单元格填满屏幕,我建议您将tableview页脚设置为空的UIView。我不知道在obj-c或Swift中执行此操作的正确语法,但在Xamarin.ios中,我会这样做:

public class ViewController : UIViewController
{
    UITableView _table;

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

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

        _table.TableFooterView = new UIView();
    }
}

上面的代码将导致没有空单元格的tableview

另一答案

如果你想在没有任何代码的情况下这样做,试试这个吧!

点击你的tableView。

将样式从“普通”更改为“分组”。

现在当你使用....

tableView.backgroundView =插入您的标签或视图

它不会显示分隔符!

另一答案

将此代码添加到一个文件中,并将集合类型更改为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
  }
}
另一答案

对于Xcode 8.3.2 - Swift 3.1

这是一个不太知名但非常简单的方法来实现向一个返回Xcode 7的空表视图添加“No Items”视图。我将留给你控制添加/删除的逻辑查看表的背景视图,但这里是和Xcode(8.3.2)故事板的流程:

  1. 在故事板中选择具有表视图的场景。
  2. 将空UIView拖动到该场景的“Scene Dock”

enter image description here

  1. 将UILabel和任何约束添加到新视图,然后为该视图创建IBOutlet

enter image description here

  1. 将该视图分配给tableView.backgroundView

enter image description here

  1. 看哪!

enter image description here

最终,这可以在您想要向视图控制器添加一个简单视图时使用,您不一定要立即显示,但您也不想手动编写代码。

另一答案

以上代码的Swift版本: -

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    var numOfSection: NSInteger = 0

    if CCompanyLogoImage.count > 0 {

        self.tableView.backgroundView = nil
        

以上是关于如果没有表格视图结果,则在屏幕上显示“无结果”的主要内容,如果未能解决你的问题,请参考以下文章

无论是不是有搜索文本匹配,UISearchBar 都显示“无结果”

IOS/Objective-C:无结果时在tableview的背景视图中显示消息

如何在整个屏幕上滚动表格视图

在 ios 的表格视图单元格中显示图像

如果显示插页式广告,则在活动中未调用onResume()和onPause()

重新定位超出屏幕框架的视图