2010-10-28 5 views
2

Je suis en train d'obtenir des cellules de table à hauteur variable mis en œuvre et ce que je pensais serait une solution élégante avéré dans un trop-plein récursion/de la pile:Comment obtenir la cellule cible de la table à l'intérieur de tableView: heightForRowAtIndexPath :?

- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    MyCustomCell *cell = (MyCustomCell *)[aTableView cellForRowAtIndexPath:indexPath]; 

    return [cell heightForObject:...]; // passing data object on indexPath 
} 

Toutes les étiquettes de cellules de table et d'autres propriétés de la vue sont initialisés à la création temps (d'une manière habituelle tableView:cellForRowAtIndexPath:). Ainsi mon idée était que je pourrais déplacer l'informatique spécifique de taille hors du contrôleur de table à mon implémentation de cellule personnalisée comme ceci. Je pourrais utiliser la même cellule dans d'autres contrôleurs de table sans pratiquement aucune duplication de code. heightForObject: pourrait regarder ses sous-vues, quelles polices ils utilisent et construire cette valeur de hauteur à partir de cela. Heck, je pourrais même changer les tailles de police pour certaines étiquettes de cellules et ils devraient théoriquement mettre à jour leur taille correctement.

Ainsi que mentionné déjà - je suis frapper ce problème de débordement de pile avec ce code. Comment irais-je obtenir cette cellule cible pour laquelle tableView:heightForRowAtIndexPath: est appelée?

+0

Je me suis juste pensé que cela pourrait être le résultat de la façon dont UITableView gère son cellulaire. Comme si vous défiliez en profondeur dans une table, il libère les objets de la cellule précédente et lorsque vous faites défiler de nouveau, il les recréera avec 'tableView: cellForRowAtIndexPath:'. Cela signifie donc qu'il est possible qu'il demande une taille de cellule même si cette cellule n'est pas encore allouée/initialisée (comme si vous étiez en bas du tableau). Je souhaite qu'il y avait un moyen de lire les propriétés de la cellule réelle/configuration lors du calcul de la hauteur. – Sim

+0

Le problème est tel que vous diagnostiquerez; La table veut essentiellement pouvoir afficher la cellule 8000 sans nécessairement garder les cellules 0-7999 en mémoire et savoir jusqu'où elle se trouve dans la liste. Ce n'est pas une mauvaise conception de l'API, elle est spécifiquement requise par les contraintes. Si vous avez, par exemple, huit types de cellules, vous pouvez charger les NIB une fois au moment de l'initialisation, stocker les hauteurs quelque part et ensuite utiliser la logique que vous utilisez pour déterminer le type de cellule de l'index pour saisir la valeur pertinente. – Tommy

Répondre

0

Vous souhaitez obtenir la cellule sélectionnée?

Puis écrire:

UITableViewCell *actCell = [self.tableView cellForRowAtIndexPath: 
              [self.tableView indexPathForSelectedRow]]; 
Questions connexes