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 ....
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;
}
J'ai écrit un guide (testé sur iOS 9), qui comprend 4 étapes:
UITableViewHeaderFooterView
viewDidLoad
, appelez registerNib:forHeaderFooterViewReuseIdentifier:
pour la vue tableviewForHeaderInSection
et utilisez dequeueReusableHeaderFooterViewWithIdentifier
pour récupérer l'en-tête/le pied de pageLes 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.
créer un (Nouveau fichier/CocoaTouchClass) UITableViewHeaderFooterView . h.m.xib normalement
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é.
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é))
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 ...
créer une nouvelle vue dans xib
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];
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:
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.
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:
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).