8
votes

COMPRENDRE UTILITEVIEWVIEW DEQUUEREUSABLECELLBELVOCATION - Retourne la cellule même sur le premier appel

J'ai du mal à comprendre comment cela fonctionne. J'ai lu de nombreux threads sur ce sujet - tels que UitailView ViewsablecellwithIdentifier et Comment DequeueReAblecElCellwithIdentifier: Travaillez-t-il? .

Cependant, mon utilitaireView déroge avec succès une cellule à chaque fois (ce n'est jamais nul), même quand il charge d'abord. J'étais sous l'impression que des cellules similaires devraient utiliser le même identifiant, vous devez donc seulement changer ce qui est nécessaire.

parce que xxx ne s'appelle jamais, Je ne sais pas comment je suis censé manipuler des cellules dans la même table avec des styles différents, car le style ne peut être défini que dans l'initialisateur.

J'ai également essayé d'utiliser différents identifiants de cellules, pour vous assurer que Il ne réutilisait pas des cellules d'une table différente ou de quelque chose. J'inscrise ces identifiants avec [TableView regsClass: ForcellruseIdentifier:]

Si je comprends, cette méthode ne doit renvoyer que les cellules créées précédemment qui ont été déplacées hors de l'écran (cachées, c.-à-d. peut être réutilisé). Ensuite, comment se fait-il qu'il retourne une cellule la première fois qu'elle est appelée?


EDIT : la confusion utilisait donc [TableView DuQueueAblecellwithIdentifier: forindexpath:] Au lieu de [TableView deQueueReusablecellwithIdentifier:] (le premier nécessite d'enregistrer l'identifiant, le second retournera nul si aucun n'est disponible - le comportement que j'attendais ci-dessus).

Toutefois, J'ai remarqué que lorsque j'ai changé mon code pour utiliser [TableView deQueusereusablecellwithIdentifier:] , il crée une nouvelle cellule et son contentView.frame a une largeur de 320 (pleine largeur) . Auparavant, quand j'ai fait Dequeue ... ForindexPath Il donnerait une largeur de 302, ou la largeur visuelle / "réelle" de la cellule. Pourquoi est-ce?

En outre, est-il un moyen de spécifier le style des UitablesViewCells regrassiered pour la réutilisation?


Solution : donc j'ai trouvé Ce fil UitailView cell.contentview.bound.Size.Width change avec la réutilisation cellulaire , qui indique lorsque vous définissez le masque automobiliateur à UIVieweWeWeWeRutoresizeflexibleleftmargin, Il est corrigé lorsque vous essayez de faire un positionnement relatif (la largeur de contenuView est initialement la largeur de la totalité, mais lorsque vous le présentez, il est rétréci, donc si vous faites vos calculs, il vous apparaîtra toujours correctement).

Je positionnais une uiswitch à droite - et lorsque je définissais le masque automoriaférateur, cela fonctionne lorsqu'il est affiché pour la première fois, mais a décalé environ 20 pixels lorsque je l'ai commutée. Je ne sais pas ce qui a causé ce changement supplémentaire, mais j'ai fini par résoudre celui-ci en réglant simplement l'UISWITCH en tant qu'accessory de la cellule.

(Ceci est partiellement hors sujet de la question initiale, mais si quelqu'un trébuche Ceci peut-être que ce serait utile). Pour toute personne se demandant spécifiquement de la question initiale, la réponse est sous la première modification.


3 commentaires

Vos cellules sont-elles créées dans une brasseuse uablevoie d'un storyboard?


Tout a créé par programme ... Ouais, beaucoup de gens disent utiliser le storyboard ... mais je ne m'y suis pas habitué et je sens que je le comprendrai mieux en sachant ce qui est réellement compris


Aucun problème avec cela, mais je me demandais parce que lorsque vous créez les cellules dans une entreprise UitailViewContoller à partir d'un storyboard, la méthode deque retourne toujours une cellule valide (si l'identifiant correct est utilisé)


4 Réponses :


0
votes

Parce que la première fois que la cellule est nulle, c'est pourquoi cela est appelé: xxx

mais si la cellule est déjà prête pour la réutilisation et que ce n'est pas nul - il ne renvoie pas la cellule et Il ne frappe pas ci-dessus si la déclaration


1 commentaires

Tout le point de la question est que la première fois que ce n'est pas nulle



9
votes

Lorsque vous appelez [TableView regsClass: ForcellruseIdentifier:] , vous enseignez à la vue Table View Que faire lorsque vous utilisez ultérieurement le réutilisateur spécifié . Donc, lorsque vous appelez plus tard [TableView DequeueReusablecellwithIdentifier:] Il sera soit:

a. Obtenez une cellule qui a déjà été créée et n'est pas actuellement utilisée

ou

b. Créez une nouvelle cellule de la classe que vous avez spécifiée

Alors, lorsque vous dérochez-vous, vous obtiendrez toujours une instance. Si vous souhaitez créer de nouvelles instances de cellules vous-même avec initwithstyle: réutilisateur: alors vous ne devez pas enregistrer une classe avec la vue Table. Alternativement, laissez l'enregistrement et ajoutez la logique pour spécifier tout ce qui doit être configuré (et envisager d'utiliser plusieurs classes de cellules différentes et des identificateurs de réutilisation).


3 commentaires

Si je sors le [TableView regsClass: ForcellreusIdentifier:] , je reçois une "NsinTrableConSistenconSyException: impossible de découvrir une cellule avec identifiant [mon identifiant]". Et quand je fais l'enregistrement, il renvoie toujours une cellule, même si j'utilise différents identifiants, je ne peux donc pas créer de styles de cellules différents


Vous devez utiliser DEQUUEREUSABLECellwithIdentifier: forindexpath: alors - cela nécessite que vous enregistrez une classe ou une nib. Vous voudrez peut-être afficher le code de vos inscriptions et TableView: Cellfrowatindexpath: si vous voulez plus d'aide.


Oui, je viens de remarquer que dans une autre question. Ainsi, en utilisant la méthode sans chemin d'index fonctionne comme prévu, mais il y a un autre problème maintenant (mise à jour de Questino)



0
votes

de la Documents Apple à https://developer.apple.com/library/ioci/#documentation/uikit/uikit/uikit/ittableview_class/reference/reference.html#//apple_ref/doc/uid/tp40006943

Appelez cette méthode à partir de votre objet source de données lorsque vous l'avez demandé de fournir une nouvelle cellule pour la vue Table. Cette méthode résonne une cellule existante si une est disponible ou crée un nouveau à l'aide de la classe ou du fichier NIB que vous avez enregistré précédemment. Si aucune cellule n'est disponible pour la réutilisation et que vous n'avez pas enregistré de fichier de classe ou de nib, cette méthode renvoie nul.

La méthode de la dequeuse sera

  1. retourne une cellule recyclée si on est disponible

  2. Créez une nouvelle cellule si vous vous êtes inscrit à un (vous avez mentionné que vous avez fait ceci)

  3. Si aucun de ceux-ci n'est vrai, il retourne nil

    Je suppose que si vous supprimez l'enregistrement (qui peut être caché dans un XIB), vous obtiendrez le résultat NIL.


3 commentaires

Je n'utilise pas le constructeur Intercae. L'ensemble de ma question était que cela ne retourne jamais nul. En termes de "renvoi d'une cellule recyclée", est-il possible d'avoir une cellule recyclée lorsque l'applicatino commence d'abord?


La première cellule n'est pas recyclée, il vient d'être créé automatiquement par la vue Table.


Oui merci, j'ai négligé la différence entre la version avec forindexpath: et celui sans



-1
votes

Si vous voyez utailview.h

début dans iOS 6, les clients peuvent enregistrer une nib ou une classe pour chaque cellule. p>

Si tous les identificateurs de réutilisation sont enregistrés, utilisez le nouveau - DEQUUEREUREABRECELLICWIhentifier : ForindexPath code>: Pour garantir une instance de cellule renvoyée. p>

Les instances renvoyées à partir de la nouvelle méthode de Dequue seront également correctement dimensionnées lorsqu'elles sont retournées. P>

(void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);

(void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);


0 commentaires