2015-08-29 1 views
1

J'ai un UIView sous-classé dans une cellule collectionView personnalisée. Il affiche bien, mais dans la méthode de délégué "didSelect" dans mon ViewController, j'ai défini une propriété pour l'UIView qui rafraîchit avec un setNeedsDisplay et DrawRect n'est pas déclenché. Cela a-t-il quelque chose à voir avec dequeueReusableCell? Comment cela serait-il codé? C'est en rapide 1.2 pas obj-c.drawRect dans la classe UIView non appelée lors de la sélection de UICollectionViewCell dans swift

class setSelection: UIView { 

    private var _checked: Bool = false 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.setNeedsDisplay() 
    } 

    override func drawRect(rect: CGRect) { 
     super.drawRect(rect) 
    . . . code . . . 
    } 

    var checked: Bool { 
     get { 
      return _checked 
     } 
     set { 
      _checked = newValue 
      self.setNeedsDisplay() 
      println(_checked) 
     } 
    } 

Ceci est la classe UIView. la propriété checked est définie dans collectionView didSelectCell. Le paramètre setNeedsDisplay dans la propriété n'échoue pas mais drawRect ne sera plus jamais appelé. ** UPDATE ** Les fonctions init ne sont pas obligatoires et doivent être supprimées.

+0

Dans viewController, j'ai défini une propriété dans la classe UIView qui exécute setNeedsDisplay. Le drawRect n'est pas exécuté. – cheborneck

+0

L'instruction setNeedsDisplay est exécutée mais le drawRect n'est déclenché que lorsque la classe est initialisée. – cheborneck

+0

J'ai essayé de publier un extrait de code, mais je n'ai pas pu le mettre en forme. – cheborneck

Répondre

0

RÉSOLU !! Je savais que cela avait quelque chose à voir avec la référence des cellules. Dans des recherches sur le problème que je pris conscience que, dans CollectionView didSelectItemAtIndexPath et didDeselectItemAtIndexPath je faisant référence à la cellule réutilisable qui est valable uniquement pour les cellules en vue et sont mises à jour dans cellForItemAtIndexPath:

let selectedCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! ImageDataCell

qui choisirait la cellule appropriée, mais faire rien avec ça. Au lieu de cela j'avais besoin de faire référence à la cellule réelle:

let selectedCell = collectionView.cellForItemAtIndexPath(indexPath) as! ImageDataCell 

maintenant la vue est actualisée lorsqu'elle est affichée lorsque cette méthode est exécutée. Vous devez toujours définir la cellule dans cellForItemAtIndexPath, car cela actualise les cellules qui se déplacent dans le cadre mais n'actualise pas une cellule sélectionnée ou désélectionnée.