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 la 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 les UITableViewCellStyle
enum pour créer différents types de défaut des cellules lors de l'appel de initWithStyle:
mais de ce que j'ai pu rassembler, ce n'est plus le cas.
La documentation d'Apple pour UITableView
états:
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 ma nouvelle 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.
Vous devez vous connecter pour publier un commentaire.
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 deUITableViewCell
(ou de ses sous-classes) en effectuantEn 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 l'initialisation par défautinitWithStyle:reuseIdentifier:
et passe le style que vous souhaitez utiliser:Aussi, il pourrait être préférable d'envoyer
registerClass:forCellReuseIdentifier:
dansviewDidLoad
, au lieu de le faire chaque fois qu'une cellule est demandé:UITableViewCell
pour obtenir les autres styles par défaut est une douleur que cela crée des fichiers inutiles. Merci pour votre commentaire et de confirmer mes soupçons.dequeueReusableCellWithIdentifier
n'est pas obsolète, de sorte que vous ne sont pas nécessaires à l'utilisation de la nouvelledequeueReusableCellWithIdentifier: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 enums.
dequeueReusableCellWithIdentifier:forIndexPath:
à fournir pour certains identificateurs la construction des cellules à l'ancienne (et retour). D'autres identificateurs appellera super et retour. Il pourrait être utile d'avoir unNSDictionary
des identificateurs de constructeur de blocs pour ce type d'identificateur.Vous pouvez éviter une étrangère sous-classe en utilisant la table de montage séquentiel interface builder:
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)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 table view controller est
viewDidLoad
appel de méthode à quelque chose comme:Bolot réponse est la bonne. Simple et vous n'avez pas besoin de créer n'importe quel fichier XIB.
Je voulais juste mettre à jour sa réponse pour celui qui est en train de faire à l'aide de Swift à la place de l'Objective-C:
Ma solution c'est d'appeler
initWithStyle: reuseIdentifier:
après que j'ai obtenu à l'aide de[self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]
. Après tout,init
est juste un autre sélecteur, et le compilateur ne fait pas de restrictions sur l'appeler sur un objet initialisé. Il faudra cependant se plaignent de ne pas utiliser le résultat de l'appel à init, donc je ne l':J'imagine que cela ne fonctionnera pas dans Swift...
initWithStyle: reuseIdentifier
la deuxième fois, vous êtes en fait de l'écrasement de la cellule avec un objet nouvellement créé. Oui, l'allocation de la mémoire a déjà été fait, et la nouvelle cellule va écraser ce même emplacement de mémoire, mais vous êtes en fait la création d'un nouvel objet lors de l'initialisation de nouveau. Cela supprime tous de l'optimisation qui est le point de l'ensemble de la réutilisation des cellules dans la première place.