没有可用于tableView的数据时显示自定义标签

时间:2011-01-30 01:24:03

标签: iphone objective-c uitableview tableviewcell

相关应用可让用户将商品标记为收藏。当用户没有保存的收藏夹时,我想通知他们这个事实(大多数我讨厌一个空白的tableView的想法)。

当用户没有标记为收藏的项目时,我的numberOfRowsInSection为零。我想设置cell.textLabel.text = @“你没有收藏夹”,但是当没有项目时,cellForRowAtIndexPath没有被调用。

我可以测试numberOfRowsInSection在遇到0时给出结果,然后在cellForRowAtIndexPath中测试1行,然后插入自定义文本,但如果他们只有一个喜欢的话会怎样?

更新

我尝试实现上面的想法,并在下面推荐,但也许我做得不对,可能是因为它是一个fetchedResultsController,其中委托方法在发生更改时更新表。

当我在表格中只有一个单元格时删除单元格时出现此错误:

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1447.6.4/UITableView.m:976 Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted). with userInfo (null)

当第一个地方没有要显示的单元格时,它会崩溃:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (0) beyond bounds (0)'

以下是相关代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    id <NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section];

    if ([sectionInfo numberOfObjects]==0) {
        return 1;
    } else {
        return [sectionInfo numberOfObjects];
    }
} 

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

if ([[_fetchedResultsController sections] objectAtIndex:0]==0) {
    cell.textLabel.text = @"You have no favorites";
} else {
    Shows *show = [_fetchedResultsController objectAtIndexPath:indexPath];

    cell.textLabel.text = show.ShowsToSerials.serialName;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", show.showTitle];
}
}

3 个答案:

答案 0 :(得分:31)

1)在我自己的iOS应用程序中,我创建了一个带有UILabel的子视图,说“没有结果” 当numberOfSectionsInTableView为零时,我将子视图添加到tableview。当它是!=零时,我将其删除。 这当然需要将子视图作为保留对象保留在内存中,以便您可以将其删除。

2)如果你想要制作一个单元格,就像你提到的那样: 当numberOfSectionsInTableView为零时,返回1.然后,在numberOfRowsInSection中返回1。 在cellForRowAtIndexPath中,检查numberOfSectionsInTableView和numberOfRowsInSection,如果它们应该为零(毕竟你返回1),则显示任何消息。

解决方案1需要维护一个变量来保存子视图,但代码更短更清晰,我相信CPU密集度更低(不会导致任何重大的性能问题)。

编辑以包含代码: 它实际上与我想的有点不同,但基本相同。 显然,这里有些东西需要改变,以适应你的代码和品味。

(确保在.h中声明 UIView * nomatchesView;

- (void)viewDidLoad{

        nomatchesView = [[UIView alloc] initWithFrame:self.view.frame];
        nomatchesView.backgroundColor = [UIColor clearColor];

        UILabel *matchesLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,320)];
        matchesLabel.font = [UIFont boldSystemFontOfSize:18];
        matchesLabel.minimumFontSize = 12.0f;
        matchesLabel.numberOfLines = 1;
        matchesLabel.lineBreakMode = UILineBreakModeWordWrap;
        matchesLabel.shadowColor = [UIColor lightTextColor];
        matchesLabel.textColor = [UIColor darkGrayColor];
        matchesLabel.shadowOffset = CGSizeMake(0, 1);
        matchesLabel.backgroundColor = [UIColor clearColor];
        matchesLabel.textAlignment =  UITextAlignmentCenter;

        //Here is the text for when there are no results
        matchesLabel.text = @"No Matches";


        nomatchesView.hidden = YES;
        [nomatchesView addSubview:matchesLabel];
        [self.tableView insertSubview:nomatchesView belowSubview:self.tableView];
    }



    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        //If there is no table data, unhide the "No matches" view
        if([data count] == 0 ){
        nomatchesView.hidden = NO;
        } else {
        nomatchesView.hidden = YES;
        }

        return [data count];
    }

答案 1 :(得分:9)

我个人会做的是以下内容。 正如您所说,在方法numberOfRowsInSection中,您应该检查tableView数据源的计数,如果为0,则应返回1以显示您想要的1个单元格。

然后在cellForRowAtIndexPath中你应该再次检查计数,如果它返回0,你知道表视图试图绘制你的“你当前没有收藏夹”,你可以设置文本。

答案 2 :(得分:5)

如下面的链接所示,如果我们创建一个标签并将其设置为UITableView的背景视图(如下所示),则很容易。 http://www.appcoda.com/pull-to-refresh-uitableview-empty/

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    if (data) {

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