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

时间:2015-02-16 00:29:38

标签: ios objective-c uitableview parse-platform

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

有最简单的方法吗?

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

我也使用Parse并将子类化为PFQueryTableViewController

@interface TableViewController : PFQueryTableViewController

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

故事板中的

TableViewController场景:

enter image description here

编辑:每个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;
}

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

enter image description here

14 个答案:

答案 0 :(得分:194)

您可以使用backgroundView的{​​{1}}属性轻松实现这一目标。

目标C:

UITableView

<强>夫特:

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

参考UITableView Class Reference

  

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 } 财产

     

表格视图的背景视图。

     

声明

     

<强>夫特

     

backgroundView

     

<强>目标C

     

var backgroundView: UIView?

     

讨论

     

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

     

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

答案 1 :(得分:90)

对于Xcode 8.3.2 - Swift 3.1

这是一个不那么知名但又非常简单的方法来实现添加&#34; No Items&#34;查看返回到Xcode 7的空表视图。我将让您控制将视图添加/删除到表的背景视图的逻辑,但这里是和Xcode的流程( 8.3.2)故事板:

  1. 在故事板中选择包含表格视图的场景。
  2. 将空的UIView拖到&#34; Scene Dock&#34;那个场景
  3. enter image description here

    1. 向新视图添加UILabel和任何约束,然后为该视图创建IBOutlet
    2. enter image description here

      1. 将该视图分配给tableView.backgroundView
      2. enter image description here

        1. 看到魔法!
        2. enter image description here

          最终,只要您想要向视图控制器添加一个简单的视图,并且您不一定要立即显示,但您也不想手动编写代码。

答案 2 :(得分: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
}

但是如果你从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
    })
}

答案 3 :(得分:7)

您可以尝试此控件。它非常整洁。 DZNEmptyDataSet

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

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

容易羞怯

答案 4 :(得分: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
        }
    }
}

具有功能的助手类:

 /* 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 :(得分: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
}

答案 6 :(得分:3)

我认为解决问题最优雅的方法是从UITableViewController切换到包含UIViewController的{​​{1}}。这样,您可以添加所需的UITableView作为主视图的子视图。

我不建议使用UITableViewCell来执行此操作,您可能需要在将来添加其他内容,而且事情可能会变得非常丑陋。

您也可以这样做,但这也不是最佳解决方案。

UIView

答案 7 :(得分:3)

numberOfSectionsInTableView方法中使用此代码: -

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

答案 8 :(得分: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

答案 9 :(得分:2)

这是适合我的解决方案。

  1. 将以下代码添加到新文件中。

  2. 将您的表类更改为自定义类&#34; MyTableView&#34;来自storyboard或.xib

  3. (这仅适用于第一部分。如果您想自定义更多内容,请相应地为其他部分更改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
                }
            }
        }
    }
    

答案 10 :(得分:1)

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

答案 11 :(得分:1)

如果您不使用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

答案 12 :(得分:1)

将此代码添加到一个文件中,然后将您的集合类型更改为CustomCollectionView

$>java -jar path/to/my/.jar

答案 13 :(得分:1)

如果您希望不使用任何代码即可执行此操作,请尝试此操作!

单击tableView。

tableView Screenshot

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

Table View properties screenshot-2

现在,当您使用....

tableView.backgroundView =插入标签或视图

它不会显示分隔符!