2013-08-30 2 views
9

J'essaie de développer mon application dans Xcode 5 et de la déboguer sous iOS 7.Comment rafraîchir UICollectionViewCell dans iOS 7?

J'ai un UICollectionViewLayoutAttributes personnalisé.

je prévois de faire quelque chose après une longue pression sur UICollectionViewCell, donc je remplacer la méthode dans UICollectionViewCell.m

- (void)applyLayoutAttributes:(MyUICollectionViewLayoutAttributes *)layoutAttributes 
{ 
    [super applyLayoutAttributes:layoutAttributes]; 
    if ([(MyUICollectionViewLayoutAttributes *)layoutAttributes isActived]) 
    { 
     [self startShaking]; 
    } 
    else 
    { 
     [self stopShaking]; 
    } 
} 

Dans iOS 6 ou au-dessous, - applyLayoutAttributes: est sifflée après que j'appelle les déclarations ci-dessous .

UICollectionViewLayout *layout = (UICollectionViewLayout *)self.collectionView.collectionViewLayout; 
[layout invalidateLayout]; 

Cependant, dans iOS 7, - applyLayoutAttributes: n'est pas appelé même si je Charger à nouveau le CollectionView.

Est-ce un bug qui va être corrigé par Apple plus tard, ou je dois faire quelque chose?

Répondre

23

Dans iOS 7, vous devez remplacer isEqual: dans votre sous-classe UICollectionViewLayoutAttributes pour comparer les propriétés personnalisées dont vous disposez. L'implémentation par défaut de isEqual: ne compare pas vos propriétés personnalisées et renvoie donc toujours YES, ce qui signifie que -applyLayoutAttributes: n'est jamais appelé.

Essayez ceci:

- (BOOL)isEqual:(id)other { 
    if (other == self) { 
      return YES; 
    } 
    if (!other || ![[other class] isEqual:[self class]]) { 
      return NO; 
    } 
    if ([((MyUICollectionViewLayoutAttributes *) other) isActived] != [self isActived]) { 
     return NO; 
    } 

    return YES; 
} 
+6

s'avère que je devais remplacer le dernier 'YES' de retour avec' retour [super isEqual: autre] '. – Cyrille

2

Oui. Comme l'a dit Calman, vous devez remplacer la méthode isEqual: pour comparer les propriétés personnalisées que vous avez. Consultez la documentation de pomme here

Si vous sous-classe et mettre en œuvre tous les attributs de mise en page personnalisée, vous devez également remplacer la isEqual héritée: méthode pour comparer les valeurs de vos propriétés. Dans iOS 7 et versions ultérieures, la vue de collection n'applique pas les attributs de disposition si ces attributs n'ont pas été modifiés. Il détermine si les attributs ont changé en comparant les anciens et nouveaux objets d'attribut à l'aide de la méthode isEqual:. Dans la mesure où l'implémentation par défaut de cette méthode vérifie uniquement les propriétés existantes de cette classe, vous devez implémenter votre propre version de la méthode pour comparer les propriétés supplémentaires. Si vos propriétés personnalisées sont toutes égales, appelez super et renvoyez la valeur résultante à la fin de votre implémentation.

1

Dans ce cas, la méthode la plus efficace serait

- (BOOL)isEqual:(id)other { 
     if (other == self) { 
      return YES; 
     } 

     if(![super isEqual:other]) { 
      return NO; 
     } 

     return ([((MyUICollectionViewLayoutAttributes *) other) isActived] == [self isActived]); 
} 
Questions connexes