82 votes

Paramètre de style de UITableViewCell si vous utilisez iOS 6 UITableView dequeueReusableCellWithIdentifier:forIndexPath:

Je suis en train de travailler sur la façon de définir l' UITableViewCellStyle lors de l'utilisation de nouvelles méthodes dans l'iOS 6 pour UITableView.

Auparavant, lors de la création d'un UITableViewCell je voudrais changer l' UITableViewCellStyle enum pour créer différents types de défaut des cellules lors de l'appel d' initWithStyle: mais de ce que j'ai pu rassembler, ce n'est plus le cas.

La documentation d'Apple pour UITableView membres de:

Valeur De Retour: Un UITableViewCell objet avec la réutilisation de l'identificateur. Cette méthode retourne toujours une cellule valide.

Discussion: Pour des raisons de performances, une vue de la table de source de données doit généralement réutilisation UITableViewCell objets lorsqu'il affecte les cellules de lignes dans son tableView:cellForRowAtIndexPath: la méthode. Une vue de la table gère une file d'attente ou d'une liste de UITableViewCell objets que la source de données a marqué pour la réutilisation. Appeler cette méthode à partir de votre source de données de l'objet lorsque l'on a demandé de fournir une nouvelle cellule pour l'affichage de la table. Cette méthode retire une cellule existante s'il est disponible ou en crée une nouvelle base sur la classe ou de la graine de fichier que vous avez précédemment enregistré.

Important: vous devez Vous inscrire à une classe ou à la plume de fichier à l'aide de la registerNib:forCellReuseIdentifier: ou registerClass:forCellReuseIdentifier: méthode avant d'appeler cette méthode.

Si vous avez enregistré une classe pour l'identificateur spécifié et une nouvelle cellule doit être créé, cette méthode initialise la cellule par l'appel de sa initWithStyle:reuseIdentifier: la méthode. Pour pointe à base de cellules, cette méthode de charge de la cellule de l'objet à partir du fichier nib. Si une cellule a été disponible pour la réutilisation, cette méthode appelle la cellule prepareForReuse méthode à la place.

C'est ainsi que mon nouveau cellForRowAtIndexPath s'occupe de la mise en œuvre de nouvelles méthodes:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell_identifier";

    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    return cell;
}

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

Je ne veux pas sous-classe UITableViewCell,, je veux juste changer le type par défaut que j'ai pu faire avant iOS 6. Il semble étrange que Apple serait de fournir une meilleure méthode, mais avec un minimum de documents à l'appui de leur mise en œuvre.

Quelqu'un a maîtrisé cela, ou pour un problème similaire? J'ai du mal à trouver toutes les informations nécessaires à tous.

106voto

bolot Points 911

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

[[<RegisteredClass> alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:<ReuseIdentifier>]

En d'autres termes, le style envoyé (UITableViewCellStyleDefault) semble être codée en dur. Pour contourner ce problème, vous devez créer une sous-classe qui remplace la valeur par défaut de l'initialiseur initWithStyle:reuseIdentifier: et passe le style que vous souhaitez utiliser:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)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;
}

Aussi, il pourrait être préférable d'envoyer registerClass:forCellReuseIdentifier: en viewDidLoad, au lieu de le faire chaque fois qu'une cellule est demandé:

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

60voto

Murray Sagal Points 1053

dequeueReusableCellWithIdentifier n'est pas obsolète, de sorte que vous ne sont pas nécessaires à l'utilisation de la nouvelle - dequeueReusableCellWithIdentifier:forIndexPath:.

L'utilisation de la nouvelle voie, ainsi que la méthode register (dans le viewDidLoad) si vous utilisez une cellule personnalisé de classe, mais l'utiliser à l'ancienne si vous souhaitez utiliser l'un des UITableViewCellStyle des enums.

11voto

Jeff Collier Points 109

Vous pouvez éviter étrangère sous-classe en utilisant la table de montage séquentiel interface builder:

  1. Dans la vue Storyboard, sélectionnez la vue de la table de la cellule prototype de cellule (sur le tableau)
  2. Dans les services publics, dans les Attributs de l'inspecteur, de modifier la valeur du Style
  3. (Facultatif) Modifiez d'autres valeurs, telles que la Sélection et l'Accessoire

Le nouvel iOS 6.0 dequeueReusableCellWithIdentifier:forIndexPath: n'utiliser ces valeurs lors de l'attribution de nouvelles cellules et de les renvoyer. (Testé sur un iOS 6.0 compilation à l'aide de Xcode 4.5.2)

7voto

Mr. Berna Points 7329

Une autre alternative que la sauvegarde d'un fichier est de créer une Plume et de l'utilisation registerNib:forCellReuseIdentifier: à la place.

Faire de la Plume est simple: Créer un nouveau .xib fichier dans Interface Builder. Supprimer l'affichage par défaut. Ajouter une Vue de la Table de la Cellule de l'objet. En utilisant les Attributs de l'Inspecteur, de changer le style de la cellule. (Ici, vous avez également la possibilité de personnaliser la cellule, en ajustant les autres attributs).

Puis dans votre vue de la table du contrôleur viewDidLoad de l'appel de méthode à quelque chose comme:

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

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