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

SRM*_*RMR 107 objective-c uitableview ios parse-platform

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

有最简单的方法吗?

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

我也使用Parse和子类化为PFQueryTableViewController:

@interface TableViewController : PFQueryTableViewController
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

Mid*_* MP 197

你可以通过使用backgroundView属性轻松实现UITableView.

目标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;
}
Run Code Online (Sandbox Code Playgroud)

迅速:

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
}
Run Code Online (Sandbox Code Playgroud)

参考UITableView类参考

backgroundView 属性

表视图的背景视图.

宣言

迅速

var backgroundView: UIView?

Objective-C的

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

讨论

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

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

  • 不要使用此解决方案。表格视图数据源方法绝不能做超出其应做的事情。`numberOfSections`应该返回一个计数。与numberOfRowsInSection相同。这些可以在任何时间多次调用。除返回计数外,切勿更新视图或更新数据或执行任何操作。更新视图的逻辑决不能使用这些方法。 (2认同)

Pau*_*lle 96

对于Xcode 8.3.2 - Swift 3.1

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

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

  1. 看哪!

在此输入图像描述

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

  • 我已经做iOS 5年了,从来不知道这一点,每天都在学习新东西.谢谢你! (9认同)

Cha*_*lva 30

以上代码的Swift版本: -

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
}
Run Code Online (Sandbox Code Playgroud)

但是如果要从JSON加载信息,则需要检查JSON是否为空,因此如果您放置这样的代码,它最初显示"无数据"消息然后消失.因为在表重新加载数据后,消息会隐藏.因此,您可以将此代码放在将JSON数据加载到数组的位置.所以: -

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
    })
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*m B 7

你可以试试这个控件.它非常整洁.DZNEmptyDataSet

或者,如果我是你,我会做的就是

  • 检查数据数组是否为空
  • 如果它为空,则向其添加一个名为@"No Data"的对象
  • 在cell.textLabel.text中显示该字符串

十分简单


Rav*_*wat 5

Swift3.0

我希望它服务于你的目的......在你的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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

辅助类具有功能:

 /* 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;
        }
Run Code Online (Sandbox Code Playgroud)


Teo*_*aru 5

Swift 3(更新):

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
}
Run Code Online (Sandbox Code Playgroud)