web-dev-qa-db-fra.com

UITableViewHeaderFooterView dans Interface Builder

Je souhaite créer une vue de section d'en-tête personnalisée dans un fichier .xib distinct à l'aide de IB

Cependant, dans IB, je ne parviens pas à trouver un composant UITableViewHeaderFooterView (similaire à UITableViewCell) et à lui affecter une réutilisation.

Alors, comment créer une section d'en-tête personnalisée?

Je crée une classe MySection qui hérite de UITableViewHeaderFooterView Crée un .xib, MySection.xib Enregistre xib pour la réutilisation des cellules

le problème est, comment utiliser le initWitReuseIdentifier ....

33
Peter Lapisu

C'est tout à fait possible et Apple fournit un exemple ici

Téléchargez l'exemple de code et consultez le fichier SectionHeaderView.xib.

La façon de le faire est de créer un xib avec un seul UIView dessus. Ensuite, définissez le type de classe sur une classe héritant de UITableViewHeaderFooterView.

Une fois que vous avez un nib avec une classe qui hérite de UITableViewHeaderFooterView, appelez ce qui suit pour enregistrer la classe et la réutiliser comme en-tête ou pied de page:

static NSString * const SectionHeaderViewIdentifier = @"SectionHeaderViewIdentifier";

[self.tableView registerNib:[UINib nibWithNibName:@"SectionHeaderView" bundle:nil] forHeaderFooterViewReuseIdentifier:SectionHeaderViewIdentifier];

Pour mettre la vue en service, implémentez la méthode déléguée table tableView: viewForHeaderInSection: comme suit:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSinteger)section {

    SectionHeaderViewClass *sectionHeaderView = (SectionHeaderView *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:SectionHeaderViewIdentifier];

    // Do stuff...

    return sectionHeaderView;
}
64
Matt Becker

J'ai écrit un guide (testé sur iOS 9), qui comprend 4 étapes:

  1. Sous-classe UITableViewHeaderFooterView
  2. Créer un nib avec la vue sous-classe et ajouter 1 vue conteneur qui contient toutes les autres vues dans l'en-tête/pied
  3. Dans viewDidLoad, appelez registerNib:forHeaderFooterViewReuseIdentifier: pour la vue table
  4. Implémentez viewForHeaderInSection et utilisez dequeueReusableHeaderFooterViewWithIdentifier pour récupérer l'en-tête/le pied de page
13
samwize

Les solutions de contournement suivantes me permettent de glisser-assigner des éléments IB au code en tant que variables. UITableViewHeaderFooterView n'autorise pas cela par défaut.

  1. créer un (Nouveau fichier/CocoaTouchClass) UITableViewHeaderFooterView . h.m.xib normalement

  2. temporairementrenommer la superclassede UITableViewHeaderFooterView en UIView. Glissez-attribuez vos éléments d'interface utilisateur au code selon vos besoins, IB affectera la valeur-clé .__ correctement, revenez à UITableViewHeaderFooterView lorsque vous avez terminé.

  3. dans votre table, utilisez registerNib: pour vous inscrire au lieu de registerClass:. prépare le reste de tableview normalement (c'est-à-dire: de la file d'attente). 
2
dklt

Cela suffit pour créer une vue et affecter sa classe dans IB (l'identifiant de réutilisation n'a pas besoin d'être défini dans le générateur d'interface (comme par un UITableViewCell personnalisé))

1
Peter Lapisu

La documentation UITableViewHeaderFooterView contient la méthode registerNib:forHeaderFooterViewReuseIdentifier:

Mais actuellement (à compter du 4 sept 13), la bibliothèque d'objets dans Interface Builder n'incluait pas UITableViewHeaderFooterView. Cela rend registerNib: forHeaderFooterViewReuseIdentifier: inutile, car il n’ya aucun moyen de configurer la vue correctement dans le nib . Peut-être vaut-il mieux essayer de réutiliser la cellule ...

0
Leszek Zarna
  1. créer une nouvelle vue dans xib 

  2. Charger la vue depuis la plume et paramétrer pour afficher comme aperçu du pied dans la vue de table

UIView * headerview = [[[[NSBundle mainBundle]] loadNibNamed: @ "ReguistrationHeaderView" propriétaire: options auto: nil] firstObject]; [self.tableview setTableFooterView: headerview];

0
Kishor

Bien que toutes ces réponses fonctionnent, elles ne répondent pas tout à fait à la question initiale de savoir comment définir reuseIdentifier à l'aide d'Interface Builder. C'est en effet possible avec l'aide de "Attributs d'exécution définis par l'utilisateur". Vous pouvez définir la reuseIdentifier directement dans Interface Builder à l'aide d'un attribut:

 Interface Builder user-defined runtime attributes

En procédant ainsi, vous obtiendrez exactement le même résultat que le champ reuseIdentifier natif de l'inspecteur d'attributs UITableViewCell Interface Builder.

0
dbart

J'ai toujours utilisé UITableViewCell comme en-têtes (ou pieds de page) pour mes tableaux afin de pouvoir les éditer directement dans le story-board.

Mon flux de travail:

  • Je crée une classe MyHeaderTableViewCell sous-classe UITableViewCell et j'ajoute toutes les prises dont j'ai besoin
  • J'ajoute une UITableViewCell à ma table dans mon storyboard
  • Je lui donne un identifiant de réutilisation (es: "HeaderCell")
  • Je file la cellule et utilise son contenu comme en-tête

La partie cruciale est de renvoyer la contentView de la headerCell (pas la headerCell elle-même), sinon vous rencontrerez des comportements étranges lorsque vous jouez avec reloadRowsAt ou des fonctions similaires (en-tête disparaissant au maximum).

Ceci est mon code:

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

    let headerCell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") as! MyHeaderTableViewCell

    headerCell.lblTitle.text = "My Title"

    return headerCell.contentView }

Je n’ai jamais eu à faire face à des problèmes (ou au moins mes clients me payaient toujours).

0
Il Pisanello