UITableView:从空白部分隐藏标题

我有一个UITableView,显示本月的费用(见截图):

我的问题是与空白部分的标题。 有什么方法可以隐藏它们吗? 数据从coredata加载。

这是生成标题标题的代码:

TitleForHeader

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { return nil; } else { NSDate *today = [NSDate date ]; int todayInt = [dataHandler getDayNumber:today].intValue; NSDate *date = [NSDate dateWithTimeIntervalSinceNow:(-(todayInt-section-1)*60*60*24)]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0]]]; [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; NSString *formattedDateString = [dateFormatter stringFromDate:date]; return formattedDateString;} } 

ViewForHeader

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { return nil; } else { UIView *headerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 312, 30)]; UILabel *title = [[UILabel alloc]initWithFrame:CGRectMake(4, 9, 312, 20)]; UIView *top = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 312, 5)]; UIView *bottom = [[UIView alloc]initWithFrame:CGRectMake(0, 5, 312, 1)]; [top setBackgroundColor:[UIColor lightGrayColor]]; [bottom setBackgroundColor:[UIColor lightGrayColor]]; [title setText:[expenseTable.dataSource tableView:tableView titleForHeaderInSection:section]]; [title setTextColor:[UIColor darkGrayColor]]; UIFont *fontName = [UIFont fontWithName:@"Cochin-Bold" size:15.0]; [title setFont:fontName]; [headerView addSubview:title]; [headerView addSubview:top]; [headerView addSubview:bottom]; return headerView; } } 

heightForHeader

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { NSLog(@"Height: %d",[tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0); if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section == 0]) { return 0; } else { return 30; } } 

numberOfRowsInSection

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { int rows = 0; for (Expense* exp in [dataHandler allMonthExpenses]) { if ([exp day].intValue == section) { rows++; } } return rows; } 

在这里输入图像说明 塞巴斯蒂安

如果在 – tableView:viewForHeaderInSection:如果部分计数为0,则return nil

编辑 :您可以使用numberOfRowsInSection获取该部分中的元素数量。

编辑 :如果numberOfRowsInSection为0,可能你应该返回nil也在titleForHeaderInSection

编辑 :你有没有实现以下方法?

 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

编辑Swift 3的例子

 override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { switch section { case 0: if self.tableView(tableView, numberOfRowsInSection: section) > 0 { return "Title example for section 1" } case 1: if self.tableView(tableView, numberOfRowsInSection: section) > 0 { return "Title example for section 2" } default: return nil // when return nil no header will be shown } return nil } 

您必须将tableView:heightForHeaderInSection:设置为0才能显示相应的部分。 这是最近改变了一些,让我在几个地方。 从UITableViewDelegate它说…

在iOS 5.0之前,对于tableView:viewForHeaderInSection:返回nil视图的部分,表格视图会自动将标题的高度调整为0。 在iOS 5.0和更高版本中,您必须在此方法中返回每个节标题的实际高度。

所以你必须做一些类似的事情

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { return 0; } else { // whatever height you'd want for a real section header } } 

在我奇怪的情况下,我不得不返回:

viewForHeaderInSection – > nil

viewForFooterInSection – >零(不要忘记页脚!)

heightForHeaderInSection – > 0.01(不为零!)

heightForFooterInSection – > 0.01

只有在这种情况下,空白部分完全消失

看看方法-[UITableViewDelegate tableView:heightForHeaderInSection:] 。 特别是伴随其文档的注释:

在iOS 5.0之前,对于tableView:viewForHeaderInSection:返回nil视图的部分,表格视图会自动将标题的高度调整为0。 在iOS 5.0和更高版本中,您必须在此方法中返回每个节标题的实际高度。

我知道这是一个老问题,但我想补充一点。 我更喜欢将titleHeader设置为nil的方法,将heightForHeaderInSection更改为0,因为它可能会导致indexPath从+1处出现问题,因为标题仍然在那里,但是隐藏起来。

所以说,build立在DBD的答案上,你可以设置titleForHeaderInSection:为零,没有行的部分是这样的:

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { return nil; } else { // return your normal return } } 

在2015年使用iOS 8和xCode6,以下为我工作。

/ *当且仅当每个部分的行数不为0时,才返回每个部分的标题。* /

 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { return nil; }else{ // here you want to return the title or whatever string you want to return for the section you want to display return (SomeObject*)someobjectArray[section].title; } } 

这似乎是正确的方式,它将正确animation和工程干净…苹果打算…

为tableView委托提供适当的信息

当没有项目的时候,返回0.0f在:

 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 

也返回零:

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 

为tableView做适当的数据删除

  1. 调用[tableView beginUpdates];
  2. 从你的dataSource中删除项目,跟踪元素被删除的地方。
  3. 使用您删除的单元格的indexPaths调用deleteRowsAtIndexPaths
  4. 如果你的数据源中没有任何项目(这里你最终只有标题)。 调用reloadSections:重新加载该部分。 这将触发正确的animation并隐藏/滑动/淡出标题。
  5. 最后调用[tableView endUpdates]; 完成更新