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