UITableView:从空白部分隐藏标题


76

我有一个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;
}

在此处输入图片说明 塞巴斯蒂安

Answers:


57

如果什么-tableView:viewForHeaderInSection:return nil如果区段计数为0。

编辑:您可以numberOfRowsInSection用来获取本节中的元素数量。

编辑titleForHeaderInSection如果您numberOfRowsInSection是0,可能还应该返回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
}

不幸的是,它不起作用..我用新代码和新屏幕截图更新了问题。
塞巴斯蒂安·弗吕基格

没错 刚刚完成问题的编辑。现在新的代码已插入,新的屏幕截图也已添加。
塞巴斯蒂安·弗吕基格

顺便说一句,您是否实现了numberOfRowsInSection?
LuisEspinoza 2012年

1
以及如果您检查笔尖中节头的大小该怎么办?。也许如果您使用0会得到更好的结果。因为您在代码中进行了设置。
LuisEspinoza'3

2
这是一个老问题了,但return nil;titleForHeaderInSection足以让我(检查之后count > 0的当然是部分)
帕特里克

135

您必须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
    }
}

不幸的是,它不起作用..我用新代码和新屏幕截图更新了问题。
塞巴斯蒂安·弗吕基格

3
静态表有些不同。此代码用于自定义表格标题视图,而不仅仅是a title。如果要设置a title,则需要在适当时返回nil方法调用tableView:titleForHeaderInSection:。如果使用自定义标题视图,则必须覆盖 viewForHeaderInSection。如果执行此操作,则此代码应该起作用。如果没有,我将需要更多信息来解决此问题。
DBD

很棒...非常感谢。较早前,我返回的空白UIView是这样的: else { vw = [[UIView alloc]init]; [vw setHidden:YES]; }
Vaibhav Saran

我在上述代码的+部分中使用了viewforheader,并且在ios 6甚至更低版本中都可以完美地工作。thnnxx好友
Amrit Trivedi

为我工作-我在ios6上
Shirish Kumar

54

在我奇怪的情况下,我必须返回:

viewForHeaderInSection->无

 viewForFooterInSection-> nil (不要忘记页脚!)

heightForHeaderInSection-> 0.01(非零!)

 heightForFooterInSection-> 0.01

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


10
我只是通过将headerHeight设置为0.01来完成的。
Akshit Zaveri 2014年

1
iOS 8.4我仍然可以使用0.01来查看文本,但是0.0可以进行魅力覆盖func tableView(tableView:UITableView,heightForHeaderInSection section:Int)-> CGFloat {如果sectionedTableData [section] .count == 0 {return CGFloat(0.0)} return CGFloat(40.0)}
DogCoffee 2015年

这完全适合我。不幸的是,我在其他任何地方都找不到。多谢,伙计。
Ruchi

即使在iOS 12.1中,您仍然必须将高度设置为0.01...。iOS有一些奇怪的错误。
Supertecnoboff

10

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

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


谢谢,所以mch伙计们-几个小时后会告诉您最新消息,并且会接受并支持效果最好的任何方法:-)
SebastianFlückiger2012年

2
不幸的是,它不起作用..我用新代码和新屏幕截图更新了问题。
塞巴斯蒂安·弗吕基格

9

我知道这是一个古老的问题,但我想补充一下。我更喜欢将the设置titleHeader为nil而不是将heightForHeaderInSectionto更改为0的方法,因为它可能会导致indexPath从+1出现问题,这是因为标头仍然存在但被隐藏了。

因此,根据上述内容并基于DBD的答案,您可以将titleForHeaderInSection:其中没有行的部分的设置为nil,如下所示:

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

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

5

这似乎是正确的方法,它将正确地进行动画处理并可以干净地工作...按照Apple的意图...

提供适当的信息给tableView委托

如果该节中没有项目,则在以下位置返回0.0f:

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

..还返回nil:

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

对tableView进行适当的数据删除

  1. 呼叫 [tableView beginUpdates];
  2. 从您的dataSource中删除项目,并跟踪删除元素的位置。
  3. deleteRowsAtIndexPaths使用您删除的单元格的indexPaths进行调用。
  4. 如果您的数据源中没有任何项(这里您将只得到标题)。致电reloadSections:以重新加载该部分。这将触发正确的动画并隐藏/滑动/淡入页眉。
  5. 最后致电[tableView endUpdates];以完成更新。

1
感谢您提供有关reloadSections的提示::-) iOS11仍然无法为我工作。有点烦人:/
firecall '18

为什么我们必须打电话reloadSections?我注意到,如果不调用它,我的表视图标题会重叠(直到我滚动,然后显示正确的标题)。
Supertecnoboff

2

斯威夫特4.2

将heightForHeaderInSection设置为零,如果您具有自定义剖面视图,则对于没有单元格的剖面,将其设置为nil。

func tableView(_ tableView: UITableView,
                   heightForHeaderInSection section: Int) -> CGFloat {
        return height_DefaultSection
    }

func tableView(_ tableView: UITableView,
                   viewForHeaderInSection section: Int) -> UIView? {

        return tableView.dataSource?.tableView(tableView, numberOfRowsInSection: section) == 0 ? nil: headerView(tableView: tableView, section: section)
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.