关于iphone:UITableView无数据屏

UITableView No Data Screen

我的 UITableView 从互联网上获取数据。有时它不接收任何(单元格)数据。它只是显示一个空白表。

如何向用户显示未找到数据记录的消息/单元格?


您希望返回一个报告缺少数据的单元格。

如果您将单元格数据保存在一个类属性的数组中(比如说 NSArray *listings),您可以:

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连接到标签。

UITableView

在您的服务器回调中,您可以将标签添加到视图。这是一个例子:

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


我正在考虑在页眉/页脚中显示 emptyDataView,或者像 Dan 建议的答案那样修改其中一行。

但我认为最干净的方法是在 tableView 之外创建一个视图。

1
@property (weak, nonatomic) IBOutlet UIView *emptyDataView;

然后像这样在 numberOfRowsInSection: 中隐藏/显示视图:

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