J'ai un UITableViewCell
qui est lié à un objet et j'ai besoin de dire si la cellule est visible. D'après les recherches que j'ai effectuées, cela signifie que je dois accéder d'une manière ou d'une autre au UITableView
qui le contient (à partir de là, il existe plusieurs façons de vérifier s'il est visible). Donc je me demande si UITableViewCell
a un pointeur vers le UITableView
, ou s'il y avait un autre moyen d'obtenir un pointeur de la cellule?
100
[cell superView]
peut être?Réponses:
Pour éviter de vérifier la version iOS, remontez de manière itérative les superviews depuis la vue de la cellule jusqu'à ce qu'un UITableView soit trouvé:
la source
@property (weak, nonatomic) UITableView *tableView;
et danstableView:cellForRowAtIndexPath:
juste ensemblecell.tableView = tableView;
.Dans iOS7 beta 5
UITableViewWrapperView
est la supervision d'unUITableViewCell
. Est égalementUITableView
superview d'unUITableViewWrapperView
.Donc, pour iOS 7, la solution est
UITableView *tableView = (UITableView *)cell.superview.superview;
Donc, pour les iOS jusqu'à iOS 6, la solution est
UITableView *tableView = (UITableView *)cell.superview;
la source
UITableViewCell
catégorie avec une nouvelle méthode,relatedTableView
qui vérifie une version iOS et renvoie la superView appropriée.Extension Swift 5
Récursivement
Utilisation de la boucle
la source
view != nil
vérification avant de déballer. Mis à jour pour un code plus propre cependantAvant iOS7, la supervision de la cellule était celle
UITableView
qui la contenait. À partir d'iOS7 GM (donc probablement dans la version publique), la supervision de la cellule est uneUITableViewWrapperView
avec sa supervision étant leUITableView
. Il existe deux solutions au problème.Solution n ° 1: créer une
UITableViewCell
catégorieIl s'agit d'un bon remplacement rapide de l'utilisation
cell.superview
, il est facile de refactoriser votre code existant - il suffit de rechercher et de remplacer par[cell relatedTable]
, et de lancer une assertion pour vous assurer que si la hiérarchie des vues change ou revient à l'avenir, elle apparaîtra immédiatement dans vos tests.Solution n ° 2: ajouter une
UITableView
référence faible àUITableViewCell
Il s'agit d'une conception bien meilleure, même si elle nécessitera un peu plus de refactorisation du code à utiliser dans les projets existants. Dans votre
tableView:cellForRowAtIndexPath
utilisation SOUITableViewCell comme classe de cellule ou assurez-vous que votre classe de cellule personnalisée est sousSOUITableViewCell
-classée à partir de et affectez le tableView à la propriété tableView de la cellule. À l'intérieur de la cellule, vous pouvez ensuite faire référence à la vue table contenant en utilisantself.tableView
.la source
[self.superview.superview isKindOfClass:[UITableView class]]
devrait être le premier, car l'iOS 7 l'est de plus en plus.S'il est visible, il a un superview. Et ... surprise ... le superview est un objet UITableView.
Cependant, avoir une supervision n'est pas une garantie d'être à l'écran. Mais UITableView fournit des méthodes pour déterminer quelles cellules sont visibles.
Et non, il n'y a pas de référence dédiée d'une cellule à une table. Mais lorsque vous sous-classez UITableViewCell, vous pouvez en introduire un et le définir lors de la création. (Je l'ai souvent fait moi-même avant de penser à la hiérarchie des sous-vues.)
Mise à jour pour iOS7: Apple a modifié la hiérarchie des sous-vues ici. Comme d'habitude lorsque vous travaillez avec des choses qui ne sont pas documentées de manière détaillée, il y a toujours un risque que les choses changent. Il est beaucoup plus économique de «remonter» la hiérarchie des vues jusqu'à ce qu'un objet UITableView soit finalement trouvé.
la source
Solution Swift 2.2.
Une extension pour UIView qui recherche de manière récursive une vue avec un type spécifique.
ou plus compact (grâce à kabiroberai):
Dans votre cellule, vous l'appelez simplement:
Notez que UITableViewCell est ajouté sur UITableView uniquement après l'exécution de cellForRowAtIndexPath.
la source
lookForSuperviewOfType:
corps de la méthode en une seule ligne, ce qui le rend encore plus rapide:return superview as? T ?? superview?.superviewOfType(type)
Tout ce que vous réussirez à faire en appelant Super View ou via la chaîne de répondeurs sera très fragile. La meilleure façon de le faire, si les cellules veulent savoir quelque chose, est de passer un objet à la cellule qui répond à une méthode qui répond à la question que la cellule veut poser, et de demander au contrôleur de mettre en œuvre la logique de déterminer ce qu'il faut répondre. (d'après votre question, je suppose que la cellule veut savoir si quelque chose est visible ou non).
Créez un protocole délégué dans la cellule, définissez le délégué de la cellule le tableViewController et déplacez toute la logique de «contrôle» de l'interface utilisateur dans le tableViewCotroller.
Les cellules de la vue tableau doivent être une vue dum qui n'affichera que des informations.
la source
J'ai créé une catégorie sur UITableViewCell pour obtenir sa table parentView:
Meilleur,
la source
Voici la version Swift basée sur les réponses ci-dessus. J'ai généralisé
ExtendedCell
pour une utilisation ultérieure.J'espère que cette aide :)
la source
J'ai basé cette solution sur la suggestion de Gabe selon laquelle l'
UITableViewWrapperView
objet est le superview de l'UITableViewCell
objet dans iOS7 beta5.Sous
UITableviewCell
- classe :la source
J'ai emprunté et modifié un peu la réponse ci-dessus et j'ai trouvé l'extrait suivant.
Le passage en classe offre la flexibilité de parcourir et d'obtenir des vues autres que UITableView dans d'autres occasions.
la source
Ma solution à ce problème est quelque peu similaire à d'autres solutions, mais utilise une boucle for élégante et est courte. Il doit également être à l'épreuve du temps:
la source
for (view = self.superview; view && ![view isKindOfClass:UITableView.class]; view = view.superview);
la source
Au lieu de superview, essayez d'utiliser ["UItableViewvariable" visibleCells].
Je l'ai utilisé dans une boucle foreach pour parcourir les cellules que l'application a vues et cela a fonctionné.
Fonctionne comme un charme.
la source
Testé au minimum, mais cet exemple de Swift 3 non générique semble fonctionner:
la source
ce code
`UITableView *tblView=[cell superview];
vous donnera une instance de l'UItableview qui contient la cellule de vue tabela source
Je vous suggère de parcourir la hiérarchie des vues de cette façon pour trouver le parent UITableView:
Sinon, votre code sera interrompu lorsque Apple modifiera à nouveau la hiérarchie des vues .
Une autre réponse qui traverse également la hiérarchie est récursive.
la source
http://www.curiousfind.com/blog/646 Merci
la source
Vous pouvez l'obtenir avec une seule ligne de code.
la source
la source
à partir de la réponse @idris, j'ai écrit une extension pour UITableViewCell dans Swift
la source