J'ai un UITableViewCell qui est lié à un objet et j'ai besoin de savoir si la cellule est visible. De la recherche, je l'ai fait, cela signifie que je dois en quelque sorte l'accès à la UITableView qui le contient (à partir de là, il y a plusieurs façons de vérifier si elle est visible). Alors je me demandais si UITableViewCell est un pointeur vers la UITableView, ou si il y a un autre moyen pour obtenir un pointeur sur la cellule?
Réponses
Trop de publicités?Dans iOS7 beta 5 UITableViewWrapperView
est le superview d'un UITableViewCell
. Aussi UITableView
est superview d'un UITableViewWrapperView
.
Donc pour iOS 7, la solution est
UITableView *tableView = (UITableView *)cell.superview.superview;
Donc, pour iOSes jusqu'à iOS 6, la solution est
UITableView *tableView = (UITableView *)cell.superview;
Avant iOS7, la cellule superview était l' UITableView
qu'il contenait. Comme d'iOS7 GM (donc sans doute dans la version publique) de la cellule superview est un UITableViewWrapperView
avec ses superview être l' UITableView
. Il y a deux solutions à ce problème.
Solution #1: Créer un UITableViewCell
catégorie
@implementation UITableViewCell (RelatedTable)
- (UITableView *)relatedTable
{
if ([self.superview isKindOfClass:[UITableView class]])
return (UITableView *)self.superview;
else if ([self.superview.superview isKindOfClass:[UITableView class]])
return (UITableView *)self.superview.superview;
else
{
NSAssert(NO, @"UITableView shall always be found.");
return nil;
}
}
@end
C'est une bonne baisse-dans le remplacement à l'aide d' cell.superview
, il est facile de revoir votre code, il suffit de chercher et de le remplacer avec de l' [cell relatedTable]
, et de les jeter dans une assertion pour s'assurer que si le point de vue de la hiérarchie des changements ou des annulations dans le futur, il apparaîtra immédiatement dans vos tests.
Solution #2: Ajout d'un Faible UITableView
référence à l' UITableViewCell
@interface SOUITableViewCell
@property (weak, nonatomic) UITableView *tableView;
@end
C'est une bien meilleure conception, mais il faudra un peu plus de code refactoring à utiliser dans des projets existants. Dans votre tableView:cellForRowAtIndexPath
utilisation SOUITableViewCell que votre classe de cellules ou assurez-vous que votre cellule personnalisé de classe est sous-classé d' SOUITableViewCell
et affecter la tableView de la cellule tableView de la propriété. À l'intérieur de la cellule, vous pouvez vous référer à l'contenant tableview l'aide d' self.tableView
.
S'il est visible, alors il a un superview. Et ... surprise ... le superview est une UITableView objet.
Toutefois, avoir un superview n'est pas une garantie d'être sur l'écran. Mais UITableView fournit des méthodes pour déterminer pour quelles cellules sont visibles.
Et non, il n'y a pas de référence à partir d'une cellule d'un tableau. Mais quand vous sous-classe UITableViewCell vous pouvez introduire un et de le définir lors de la création. (Je l'ai fait moi-même beaucoup avant que je pense de la sous-vue de la hiérarchie.)
Mise à jour pour iOS7: Apple a changé la sous-vue de la hiérarchie ici. Comme d'habitude lorsque l'on travaille avec des choses qui ne sont pas détaillées documentés, il y a toujours un risque que les choses changent. Il est loin de veille à "ramper" le point de vue de la hiérarchie jusqu'à ce qu'un UITableView objet est finalement trouvé.
J'ai créé une catégorie sur UITableViewCell pour obtenir son parent tableView:
@implementation UITableViewCell (ParentTableView)
- (UITableView *)parentTableView {
UITableView *tableView = nil;
UIView *view = self;
while(view != nil) {
if([view isKindOfClass:[UITableView class]]) {
tableView = (UITableView *)view;
break;
}
view = [view superview];
}
return tableView;
}
@end
Mieux,