web-dev-qa-db-fra.com

Changer le titre de l'en-tête/du pied de section de UITableView sans recharger la vue tableau

Est-il possible de recharger l'en-tête/le pied de section d'une vue tabulaire sans appeler [tableView reloadData];?

En fait, je souhaite afficher le nombre de cellules d'une section de vue tableau dans son pied de section. La vue tabulaire est modifiable et j'efface ou insère des lignes à l'aide de

– insertRowsAtIndexPaths:withRowAnimation:
– deleteRowsAtIndexPaths:withRowAnimation:

Il semble que ces méthodes ne mettent pas à jour le pied de section. Étrangement, quand j'appelle ces méthodes la méthode source de données vue tableau

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

est appelé (deux fois!) mais il ne met pas à jour la vue tableau avec les nouvelles valeurs !!

Quelqu'un a une idée de comment résoudre ce problème?

28
Ali

J'ai réussi à le faire de manière indirecte: j'ai créé un UILabel et je l'ai défini comme en-tête/pied de section.

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

Est-ce que quelqu'un connaît un moyen de faire cela sans définir une vue de pied de page personnalisée?

7
Ali

Si vous avez juste un en-tête ou un pied de texte basique, vous pouvez y accéder directement:

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

de même pour l'en-tête:

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

Cela devrait fonctionner:

    UIView.setAnimationsEnabled(false)
    tableView.beginUpdates()

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

        containerView.sizeToFit()
    }

    tableView.endUpdates()
    UIView.setAnimationsEnabled(true)
16
Craig Miller

Voici comment vous le faites dans Swift 3.0

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

Voici une autre façon de le faire:

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];
3
hyperspasm

Consultez la documentation de UITableView, ou plus précisément -reloadSections:withRowAnimation:

2
Tim

Vous pouvez aussi le faire de cette façon

override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
    switch section {
        case 0:
            return "Some string"
        default:
            return ""
    }
}
1
Adam Golczak

J'ai constaté que le texte de pied de page ne se mettait pas à jour correctement s'il ne remplissait plus une ligne et remplissait plusieurs lignes. Réinitialiser la largeur et la hauteur de l'étiquette résoudrait ce problème.

    UIView.setAnimationsEnabled(false)
    textLabel.frame = CGRect(x: textLabel.frame.minX,
                             y: textLabel.frame.minY,
                             width: 0,
                             height: 0)
    tableView.beginUpdates()
    textLabel.text = "Your text"
    textLabel.sizeToFit()
    tableView.endUpdates()
    UIView.setAnimationsEnabled(true)
0
mukaissi