Définition du style de UITableViewCell lors de l’utilisation d’iOS 6 UITableView dequeueReusableCellWithIdentifier: forIndexPath:

J’essaie de déterminer comment définir UITableViewCellStyle lors de l’utilisation des nouvelles méthodes dans iOS 6 pour UITableView .

Auparavant, lors de la création d’un object UITableViewCell je modifierais l’énumération UITableViewCellStyle pour créer différents types de cellules par défaut lors de l’appel d’ initWithStyle: mais ce que je peux en initWithStyle: , ce n’est plus le cas.

La documentation Apple pour UITableView indique:

Valeur de retour : Un object UITableViewCell avec l’identifiant de réutilisation associé. Cette méthode renvoie toujours une cellule valide.

Discussion : Pour des raisons de performances, la source de données d’une vue de table doit généralement réutiliser les objects UITableViewCell lorsqu’elle affecte des cellules à des lignes dans sa méthode tableView: cellForRowAtIndexPath :. Une vue de table conserve une queue ou une liste d’objects UITableViewCell que la source de données a marqué pour être réutilisée. Appelez cette méthode à partir de votre object de source de données lorsque vous êtes invité à fournir une nouvelle cellule pour la vue de table. Cette méthode met en queue une cellule existante si une cellule est disponible ou en crée une nouvelle en fonction de la classe ou du fichier nib précédemment enregistré.

Important : Vous devez enregistrer un fichier classe ou nib à l’aide de la méthode registerNib: forCellReuseIdentifier: ou registerClass: forCellReuseIdentifier: avant d’appeler cette méthode.

Si vous avez enregistré une classe pour l’identificateur spécifié et qu’une nouvelle cellule doit être créée, cette méthode initialise la cellule en appelant sa méthode initWithStyle: reuseIdentifier:. Pour les cellules basées sur le nib, cette méthode charge l’object cellule à partir du fichier nib fourni. Si une cellule existante était disponible pour être réutilisée, cette méthode appelle à la place la méthode prepareForReuse de la cellule.

Voici comment mon nouveau cellForRowAtIndexPath implémentation des nouvelles méthodes:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSSsortingng *cellIdentifier = @"cell_identifier"; [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; return cell; } 

Le code que j’ai à ce jour fonctionne bien mais renvoie toujours le style par défaut. Comment puis-je changer cela pour pouvoir créer des cellules avec les autres styles tels que UITableViewCellStyleDefault , UITableViewCellStyleValue1 , UITableViewCellStyleValue2 et UITableViewCellStyleSubtitle ?

Je ne veux pas sous- UITableViewCell , je veux juste changer le type par défaut comme je pouvais le faire avant iOS 6. Il semble étrange qu’Apple fournisse des méthodes améliorées mais avec un minimum de documentation pour supporter leur implémentation.

Est-ce que quelqu’un l’a maîsortingsé ou a rencontré un problème similaire? J’ai du mal à trouver des informations raisonnables du tout.

Je sais que vous avez dit que vous ne vouliez pas créer une sous-classe, mais cela semble inévitable. Basé sur le code d’assemblage lors du test dans le simulateur iOS 6.0, UITableView crée de nouvelles instances de UITableViewCell (ou de ses sous-classes) en effectuant

 [[ alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:] 

En d’autres termes, le style envoyé ( UITableViewCellStyleDefault ) semble être codé en dur. Pour contourner ce initWithStyle:reuseIdentifier: , vous devrez créer une sous-classe qui remplace l’initialiseur par défaut initWithStyle:reuseIdentifier: et transmet le style que vous souhaitez utiliser:

 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSSsortingng *)reuseIdentifier { // ignore the style argument, use our own to override self = [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier]; if (self) { // If you need any further customization } return self; } 

En outre, il peut être préférable d’envoyer registerClass:forCellReuseIdentifier: dans viewDidLoad , au lieu de le faire chaque fois qu’une cellule est demandée:

 - (void)viewDidLoad { [super viewDidLoad]; [self.tableView registerClass: forCellReuseIdentifier:]; } 

dequeueReusableCellWithIdentifier n’est pas obsolète, vous n’êtes donc pas obligé d’utiliser le nouveau dequeueReusableCellWithIdentifier:forIndexPath:

Utilisez la nouvelle méthode avec la méthode register appropriée (dans viewDidLoad) si vous utilisez une classe de cellules personnalisée mais utilisez l’ancienne méthode si vous souhaitez utiliser l’une des énumérations UITableViewCellStyle.

Vous pouvez éviter une sous-classe externe en utilisant le générateur d’interface de storyboard:

  1. Dans la vue Storyboard, sélectionnez la cellule prototype de cellule de la vue tableau (dans la vue tableau)
  2. Dans la vue Utilitaires, dans l’inspecteur Atsortingbuts, modifiez la valeur du style
  3. (Facultatif) Modifier d’autres valeurs telles que Sélection et Accessoire

Le nouveau iOS 6.0 dequeueReusableCellWithIdentifier:forIndexPath: utilise ces valeurs lors de l’allocation de nouvelles cellules et de leur retour. (Testé sur une compilation iOS 6.0 utilisant Xcode 4.5.2)

Une autre alternative qui sauve un fichier consiste à créer un Nib et à utiliser registerNib:forCellReuseIdentifier: place.

Rendre le Nib facile: créez un nouveau fichier .xib dans Interface Builder. Supprimez la vue par défaut. Ajoutez un object Cellule de vue tabulaire. À l’aide de l’inspecteur d’atsortingbuts, modifiez le style de la cellule. (Ici, vous avez également la possibilité de personnaliser la cellule en ajustant d’autres atsortingbuts.)

Ensuite, dans la méthode viewDidLoad votre contrôleur de vue de viewDidLoad , appelez quelque chose comme:

 [self.tableView registerNib:[UINib nibWithNibName:@"StyleSubtitleTableCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Cell"]; 

La réponse de Bolot est la bonne. Simple et vous n’avez pas besoin de créer de fichier XIB.

Je voulais juste mettre à jour sa réponse pour quiconque le fait en utilisant Swift au lieu d’Objective-C:

 override init(style: UITableViewCellStyle, reuseIdentifier: Ssortingng?) { super.init(style: .value1, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } 

Ma solution est d’appeler initWithStyle: reuseIdentifier: après l’avoir obtenu en utilisant [self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath] . Après tout, init n’est qu’un autre sélecteur, et le compilateur ne fait aucune ressortingction pour l’appeler sur un object déjà initialisé. Il se plaindra cependant de ne pas utiliser le résultat de l’appel init, donc je fais:

 UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]; cell = [cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellId"]; 

J’imagine que cela ne fonctionnera pas à Swift …