我有一个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;
}
塞巴斯蒂安
答案 0 :(得分:132)
您必须将tableView:heightForHeaderInSection:
设置为0才能显示相应的部分。最近这种情况发生了变化,让我在几个地方。来自UITableViewDelegate
,它说......
在iOS 5.0之前,表格视图会自动调整高度 对于tableView:viewForHeaderInSection的部分,标头为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
}
}
答案 1 :(得分:54)
如果在tableView:viewForHeaderInSection:
中return nil
,如果部分计数为0,该怎么办?
编辑:
您可以使用numberOfRowsInSection
来获取该部分中的元素数量。
修改强>:
如果titleForHeaderInSection
为0,也可以在numberOfRowsInSection
中返回nil。
修改强>: 您是否实施了以下方法?
-(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
}
答案 2 :(得分:53)
在我奇怪的情况下,我必须回来:
viewForHeaderInSection - >零
viewForFooterInSection - > nil (不要忘记页脚!)
heightForHeaderInSection - > 0.01(不为零!)
heightForFooterInSection - > 0.01
仅在这种情况下,空白部分完全消失
答案 3 :(得分:10)
看一下方法-[UITableViewDelegate tableView:heightForHeaderInSection:]
。特别是其文档附带的注释:
在iOS 5.0之前,表格视图会自动调整高度 对于
tableView:viewForHeaderInSection:
的部分,标题为0 返回了nil
视图。在iOS 5.0及更高版本中,您必须返回实际值 此方法中每个节头的高度。
答案 4 :(得分:9)
我知道这是一个老问题,但我想补充一下。我更喜欢将titleHeader
设置为nil而不是将heightForHeaderInSection
更改为0的方法,因为它可能会导致问题indexPath
为+1,因为标题仍然存在但隐藏了。
因此,在DBD's answer上构建并且可以将titleForHeaderInSection:
设置为nil,其中没有行的部分就像这样:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) {
return nil;
} else {
// return your normal return
}
}
答案 5 :(得分:7)
2015年使用iOS 8和Xcode 6时,以下内容对我有用:
/* Return the title for each section if and only if the row count for each section is not 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;
}
}
答案 6 :(得分:5)
这似乎是正确的方式,它将正确地制作动画。工作干净......正如Apple所期望的那样......
向tableView委托提供适当的信息
当部分中没有项目时,返回0.0f in:
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
..同样返回nil:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
为tableView执行适当的数据删除
[tableView beginUpdates];
deleteRowsAtIndexPaths
。reloadSections:
重新加载该部分。这将触发正确的动画并隐藏/滑动/淡化标题。[tableView endUpdates];
完成更新.. 答案 7 :(得分:2)
Swift 4.2
将heightForHeaderInSection设置为零,如果您具有自定义剖面视图,则对于没有单元格的剖面,将其设置为nil。
img_list = []