如果没有表格视图结果,则在屏幕上显示“无结果”
我有一个tableview
,有时可能没有任何结果列表,所以如果没有结果(无论是标签还是一个表格视图单元格?),我想提出一些说“没有结果”的东西 。
有没有一个最简单的方法来做到这一点?
我会试着在tableview
后面的label
,然后根据结果隐藏其中的一个,但由于我正在使用TableViewController
而不是一个正常的ViewController
我不知道这是多么聪明或可行。
我也使用Parse
和subclassing作为PFQueryTableViewController
:
@interface TableViewController : PFQueryTableViewController
我可以提供任何额外的细节需要,让我知道!
在Storyboard中的TableViewController
场景:
编辑:每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; }
这是我得到的视图,它仍然有分隔线。 我觉得这是一个小小的改变,但我不确定为什么分隔线显示出来?
你可以通过使用UITableView
backgroundView
属性来轻松实现。
目标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类参考
backgroundView
属性表视图的背景视图。
宣言
迅速
var backgroundView: UIView?
Objective-C的
@property(nonatomic, readwrite, retain) UIView *backgroundView
讨论
表视图的背景视图会自动resize以匹配表视图的大小。 此视图作为所有单元格,标题视图和页脚视图后面的表视图的子视图放置。
您必须将此属性设置为零才能设置表视图的背景颜色。
对于Xcode 8.3.2 – Swift 3.1
这是一个不太为人所熟知的,但非常简单的方法来实现添加一个“没有项目”视图到一个空的表视图,回到Xcode 7.我会让你控制这个逻辑,添加/删除查看表格的背景视图,但这里是和Xcode(8.3.2)故事板的stream程:
- select具有您的表视图的情节提要中的场景。
- 将一个空的UIView拖到该场景的“Scene Dock”中
- 将UILabel和任何约束添加到新视图,然后为该视图创build一个IBOutlet
- 将该视图分配给tableView.backgroundView
- 看着魔法!
最终,只要你想添加一个简单的视图到你的视图控制器,你不一定要立即显示,但你也不想手动代码,这个工程。
上述代码的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 }) }
你可以试试这个控制。 它非常整齐。 DZNEmptyDataSet
或者如果我是你,我只会做
- 检查你的数据数组是否为空
- 如果它是空的,则添加一个名为@“No Data”的对象
- 在cell.textLabel.text中显示该string
十分简单
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 }
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 } } }
助手类与function:
/* 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; }
在您的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]; }
我认为解决你的问题的最优雅的方法是从UITableViewController
切换到包含UITableViewController
的UIViewController
。 这样你可以添加你想要的任何UIView
作为主视图的子视图。
我不build议使用UITableViewCell来做到这一点,你可能需要在将来添加额外的东西,事情可以很快变得丑陋。
你也可以做这样的事情,但这不是最好的解决scheme。
UIWindow* window = [[UIApplication sharedApplication] keyWindow]; [window addSubview: OverlayView];
如果tableview没有结果,我会提供一个覆盖视图,它具有所需的外观和消息。 你可以在ViewDidAppear中做到这一点,所以在显示/不显示视图之前你有结果。
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
这是为我工作的解决scheme。
-
将下面的代码添加到一个新的文件。
-
将您的表类更改为故事板或.xib中的自定义类“MyTableView”
(这只适用于第一部分,如果你想定制更多的话,相应的改变MyTableView的reloadData()函数)
公共类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页脚,并且不希望tableview用空的默认表格单元填充屏幕,我会build议你将你的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