105 votes

Comment obtenir UITableView de UITableViewCell?

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?

159voto

idris Points 876

Pour éviter la version iOS vérifie

id view = [tableViewCellInstance superview];

while (view && [view isKindOfClass:[UITableView class]] == NO) {
    view = [view superview]; 
}

    UITableView *tableView = (UITableView *)view;

48voto

user2441567 Points 312

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;

25voto

Michael G. Emmons Points 16681

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.

7voto

Hermann Klecker Points 8461

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é.

6voto

boliva Points 2588

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,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X