UITableView No Data Screen
我的 UITableView 从互联网上获取数据。有时它不接收任何(单元格)数据。它只是显示一个空白表。
如何向用户显示未找到数据记录的消息/单元格?
您希望返回一个报告缺少数据的单元格。
如果您将单元格数据保存在一个类属性的数组中(比如说
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | -(NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section { if ([self.listings count] == 0) { return 1; // a single cell to report no data } return [self.listings count]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if ([self.listings count] == 0) { UITableViewCell *cell = [[[UITableViewCell alloc] init] autorelease]; cell.textLabel.text = @"No records to display"; //whatever else to configure your one cell you're going to return return cell; } // go on about your business, you have listings to display } |
您可以在视图中添加 UILabel
这可以通过编程方式或在您的 xib 中创建。如果您的 xib 包含作为 [self view] 的 UITableView,这对于 UITableViewController 来说很典型,那么为您的 viewController
上的标签创建一个属性
1 | @property (nonatomic, retain) IBOutlet UILabel *noResultsLabel; |
将 UILabel 从库中拖到文档窗口中,作为"表格视图"的兄弟。
设置文本属性(36pt粗体,浅灰色看起来还不错)
控制从"文件的所有者"拖动以将outlets连接到标签。
在您的服务器回调中,您可以将标签添加到视图。这是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #pragma mark - #pragma mark Server callbacks - (void)serviceExecutionComplete:(NSMutableArray *)results { [self setServerData:results]; if ([results count] == 0) { // no results, CGRect viewFrame = [[self view] frame]; [[self noResultsLabel] setFrame:CGRectMake(0, (viewFrame.size.height - 100) / 2, viewFrame.size.width, 50.0)]; [[self view] addSubview:[self noResultsLabel]]; } else { [[self noResultsLabel] removeFromSuperview]; [self.tableView reloadData]; } } |
你可以在 tableView:numberOfRowsInSection: 中做同样的事情,如果这更适合你的设计
您可以在 -tableView:cellForRowAtIndexPath: 实现中添加一个测试,并在没有数据时显示一个特殊的 UITableViewCell 说"没有可用的结果"。
另一种通常看起来更好的方法是直接向 UITableView 添加自定义视图。当有结果要显示时不要忘记删除它。
如以下链接中所述,如果我们创建一个标签并将其设置为 UITableView 的背景视图,如下所示。可能对某人有用。 http://www.appcoda.com/pull-to-refresh-uitableview-empty/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. if (data) { self.tableView.backgroundView = nil; self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; return 1; } else { // Display a message when the table is empty UILabel *messageLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; messageLabel.text = @"No data is currently available. Please pull down to refresh."; messageLabel.textColor = [UIColor blackColor]; messageLabel.numberOfLines = 0; messageLabel.textAlignment = NSTextAlignmentCenter; messageLabel.font = [UIFont fontWithName:@"Palatino-Italic" size:20]; [messageLabel sizeToFit]; self.tableView.backgroundView = messageLabel; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; } return 0; } |
我正在考虑在页眉/页脚中显示
但我认为最干净的方法是在 tableView 之外创建一个视图。
1 | @property (weak, nonatomic) IBOutlet UIView *emptyDataView; |
然后像这样在
1 2 3 4 5 6 7 8 9 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { id sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section]; // Show empty data view if no data _emptyDataView.hidden = ([sectionInfo numberOfObjects] == 0) ? NO : YES; return [sectionInfo numberOfObjects]; } |
这适用于 Core Data NSFetchedResultsController,一旦有数据就隐藏视图。
这里我使用如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ NSInteger numOfSections = 0; if ([jsonArray count] != 0){ tableview.separatorStyle = UITableViewCellSeparatorStyleSingleLine; numOfSections = 1; tableview.backgroundView = nil; } else{ UILabel *noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableview.bounds.size.width, tableview.bounds.size.height)]; noDataLabel.text = @"No item found."; noDataLabel.textColor = [UIColor blackColor]; noDataLabel.textAlignment = NSTextAlignmentCenter; tableview.backgroundView = noDataLabel; tableview.separatorStyle = UITableViewCellSeparatorStyleNone; } return numOfSections; } - (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section{ return [jsonArray count ]; } |