180 votes

Comment mettre en œuvre des en-têtes et des pieds de section de vue de tableau personnalisés avec Storyboard

Sans utiliser de storyboard, nous pourrions simplement faire glisser une UIView sur la toile, l'étaler, puis la placer dans les tableView:viewForHeaderInSection o tableView:viewForFooterInSection méthodes de délégation.

Comment faire avec un StoryBoard où l'on ne peut pas faire glisser une UIView sur le canevas ?

386voto

Tieme Points 13569

Utilisez simplement une cellule prototype comme en-tête et/ou pied de page de votre section.

  • ajoutez une cellule supplémentaire et mettez-y les éléments que vous souhaitez.
  • définir l'identifiant à quelque chose de spécifique (dans mon cas SectionHeader)
  • mettre en œuvre la tableView:viewForHeaderInSection: ou la méthode tableView:viewForFooterInSection: méthode
  • utiliser [tableView dequeueReusableCellWithIdentifier:] pour obtenir l'en-tête
  • mettre en œuvre la tableView:heightForHeaderInSection: méthode.

(see screenhot)

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    static NSString *CellIdentifier = @"SectionHeader"; 
    UITableViewCell *headerView = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (headerView == nil){
        [NSException raise:@"headerView == nil.." format:@"No cells with matching CellIdentifier loaded from your storyboard"];
    }
    return headerView;
}  

Edit : Comment changer le titre de l'en-tête (question commentée) :

  1. Ajouter une étiquette à la cellule d'en-tête

  2. définir le tag de l'étiquette à un nombre spécifique (par exemple 123)

  3. Dans votre tableView:viewForHeaderInSection: obtient l'étiquette en appelant la méthode

    UILabel *label = (UILabel *)[headerView viewWithTag:123]; 
  4. Vous pouvez maintenant utiliser l'étiquette pour définir un nouveau titre :

    [label setText:@"New Title"];

2 votes

En procédant ainsi, comment changer le titre de l'en-tête ?

2 votes

Je l'ai fait, mais j'ai un problème qui pourrait être lié. Lorsque je tape sur l'en-tête de la section, il sélectionne la cellule du tableau située en dessous. Ce n'est pas souhaité, car je voudrais que rien ne se passe. J'ai essayé de définir le paramètre userInteractionEnabled sur false mais cela ne fonctionne pas.

0 votes

Cela ne se produit pas avec mon projet. Cela ressemble à un comportement étrange.

22voto

damon Points 762

Je l'ai fait fonctionner dans iOS7 en utilisant une cellule prototype dans le storyboard. J'ai un bouton dans la vue d'en-tête de ma section personnalisée qui déclenche une séquence configurée dans le storyboard.

Commencez par La solution de Tieme

Comme le souligne pedro.m, le problème est que le fait d'appuyer sur l'en-tête de section entraîne la sélection de la première cellule de la section.

Comme le souligne Paul Von, ce problème est résolu en renvoyant la ContentView de la cellule au lieu de la cellule entière.

Cependant, comme le souligne Hons, un appui long sur l'en-tête de cette section fera planter l'application.

La solution est de supprimer tout gestureRecognizers de contentView.

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
     static NSString *CellIdentifier = @"SectionHeader";
     UITableViewCell *sectionHeaderView = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

     while (sectionHeaderView.contentView.gestureRecognizers.count) {
         [sectionHeaderView.contentView removeGestureRecognizer:[sectionHeaderView.contentView.gestureRecognizers objectAtIndex:0]];
     }

     return sectionHeaderView.contentView; }

Si vous n'utilisez pas les gestes dans les vues d'en-tête de vos sections, cette petite astuce semble y parvenir.

2 votes

Vous avez raison. Je viens de le tester et cela fonctionne, j'ai donc mis à jour mon message ( hons82.blogspot.it/2014/05/uitableviewheader-done-right.html ) contenant toutes les solutions possibles que j'ai trouvées au cours de mes recherches. Merci beaucoup pour cette correction

0 votes

Bonne réponse ... Merci.

13voto

barksten Points 171

Si vous utilisez des storyboards, vous pouvez utiliser une cellule prototype dans la vue tableau pour mettre en page votre vue d'en-tête. Définissez un identifiant unique et pour viewForHeaderInSection, vous pouvez retirer de la file la cellule avec cet identifiant et la transformer en UIView.

9voto

Seamus Points 1008

La solution que j'ai trouvée est fondamentalement la même que celle utilisée avant l'introduction des storyboards.

Créez un nouveau fichier de classe d'interface vide. Faites glisser un UIView sur le canevas, en le disposant comme vous le souhaitez.

Chargez la plume manuellement, affectez-la à la section d'en-tête/de pied appropriée dans les méthodes de délégation viewForHeaderInSection ou viewForFooterInSection.

J'avais l'espoir qu'Apple simplifie ce scénario avec des storyboards et je continuais à chercher une solution meilleure ou plus simple. Par exemple, il est facile d'ajouter des en-têtes et des pieds de tableaux personnalisés.

0 votes

Eh bien apple l'a fait si vous utilisez la cellule du storyboard comme méthode d'en-tête :) stackoverflow.com/questions/9219234/#11396643

2 votes

Sauf que cela ne fonctionne que pour les cellules prototypes, pas pour les cellules statiques.

1 votes

Une solution très simple consiste à utiliser Pixate vous pouvez faire beaucoup de personnalisation sans avoir une référence à l'en-tête. Tout ce que vous avez à implémenter est tableView:titleForHeaderInSection qui est une phrase toute faite.

2voto

Vipera Berus Points 149

J'avais l'habitude de faire ce qui suit pour créer des vues en-tête/pied de page paresseusement :

  • Ajoutez au storyboard un contrôleur de vue de forme libre pour l'en-tête et le pied de section.
  • Gérer tout ce qui concerne l'en-tête dans le contrôleur de vue.
  • Dans le contrôleur de vue de la table, fournissez un tableau mutable de contrôleurs de vue pour les en-têtes/pieds de section repeuplés avec [NSNull null]
  • Dans viewForHeaderInSection/viewForFooterInSection, si le contrôleur de vue n'existe pas encore, créez-le avec storyboards instantiateViewControllerWithIdentifier, mémorisez-le dans le tableau et renvoyez la vue du contrôleur de vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X