9

有问题的应用程序可以让用户将项目标记为收藏。当用户没有保存收藏夹时,我想通知他们这个事实(主要是我讨厌空白 tableView 的想法)。

numberOfRowsInSection当没有用户标记为收藏的项目时,我的为零。我想设置 cell.textLabel.text = @"You have no favourites" 但是当没有表格的项目时cellForRowAtIndexPath不会被调用。

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

更新

我尝试实现我上面的想法,并在下面推荐,但也许我做得不对,可能是因为它是一个 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];
}
}
4

3 回答 3

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];
    }
于 2011-01-30T01:34:47.327 回答
9

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

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

于 2011-01-30T01:31:26.163 回答
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;
}
于 2015-03-03T11:07:29.780 回答