Changing UITableView's section header/footer title without reloading the whole table view

42,568

Solution 1

I managed to do it in an indirect way: I created a UILabel and set it as section header/footer.

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    // update sectionFooterView.text    
    return sectionFooterView;
}

- (void)viewDidLoad {
    // create sectionFooterView in Interface Builder, change the frame here
    // use Font-size:15 , BG-Color: clearColor , text-Color: RGB=(97,105,118) 
    // and Text-alignment:Center to look like table view's original footer
    sectionFooterView.frame = CGRectMake(0, 10, 320, 12);
}

Does anyone know a way to do this without setting a custom footer view?

Solution 2

If you just have a basic text header or footer, you can access them directly:

[tableView footerViewForSection:indexPath.section].textLabel.text = [self tableView:tableView titleForFooterInSection:indexPath.section];

similarly for the header:

[tableView headerViewForSection:indexPath.section].textLabel.text = [self tableView:tableView titleForHeaderInSection:indexPath.section];

Solution 3

This should work:

    UIView.setAnimationsEnabled(false)
    tableView.beginUpdates()

    if let containerView = tableView.footerViewForSection(0) {
        containerView.textLabel!.text = "New footer text!"

        containerView.sizeToFit()
    }

    tableView.endUpdates()
    UIView.setAnimationsEnabled(true)

Solution 4

This is how you do it in Swift 3.0

tableView.beginUpdates()
tableView.headerView(forSection: indexPath.section)?.textLabel?.text = "Some text"
tableView.endUpdates()

Solution 5

Here's another way to do it:

UITableViewHeaderFooterView *headerView=[self.tableView headerViewForSection:1];
CATransition *animation = [CATransition animation];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.type = kCATransitionFade;
animation.duration = 0.35;
[headerView.textLabel.layer addAnimation:animation forKey:@"kCATransitionFade"];
headerView.textLabel.text=[self tableView:self.tableView titleForHeaderInSection:1];
[headerView.textLabel sizeToFit];
Share:
42,568
Ali
Author by

Ali

Updated on April 19, 2020

Comments

  • Ali
    Ali about 4 years

    Is there any way to reload the section header/footer of a table view without calling [tableView reloadData];?

    In fact, I want to show the number of cells in a table view's section in its section footer. The table view is editable and I delete or insert rows using

    – insertRowsAtIndexPaths:withRowAnimation:
    – deleteRowsAtIndexPaths:withRowAnimation:
    

    It seems that these methods do not update the section footer. Strangely, when I call these methods the table view data-source method

    - (NSString *)tableView:(UITableView *)table titleForFooterInSection:(NSInteger)section 
    

    is called (twice!) but it does not update the table view with the new values!!

    Anyone has any idea how to fix this problem?

  • Adrian Schönig
    Adrian Schönig over 12 years
    This works but it's not the most efficient since it won't just update the section header/footer, but will also update all the cells. Seems like Ali's answer is the way to go.
  • Tim
    Tim over 12 years
    I think that apple expects that if you change the footer or header, the content will change too. But yes, if you want to customize much more than just text displaying semi-statically, then using viewForFooter/Header can be easier. Just be aware that the default section headers and footers do a lot of formatting for you, and overriding them like this for something trivial may also not be the best option.
  • Tony the Tech
    Tony the Tech almost 11 years
    This is the way to do it. Whenever you call [sectionFooterView setText: @"Some text"] it will update on-screen.
  • Blip
    Blip about 9 years
    But accessing the textLabel directly doesn't change the frame to fit the new text. Do I have to call sizeToFit on the footer/header view?
  • Vadim Yelagin
    Vadim Yelagin almost 9 years
    You'll need to call beginUpdates/endUpdates to have the table view recalculate its layout
  • DogCoffee
    DogCoffee almost 9 years
    Gold! tableView.headerViewForSection(indexPath.section)?.textLabel‌​.text = tableView(tableView, titleForHeaderInSection: indexPath.section)
  • maganap
    maganap almost 8 years
    It does work pretty fine in iOS 9, Swift 2.2. And it's much more cleaner than harcoding frame rectangles, which should certainly be avoided.
  • Ben Guild
    Ben Guild over 7 years
    Note that this doesn't respect the styling of the OS. Such as the all uppercase font that is applied to grouped section headers.
  • ShadeToD
    ShadeToD about 4 years
    With your solution you can't change string outside titleForFooterInSection.