-1

Je souhaite définir UICollectionViewLayout pour mon UICollectionView mais lorsque la couche est définie, la fonction cellForItemAt n'est pas appelée. Je ne comprends pas pourquoi. Mon UICollectionView est dans un XIB, avec ce code pour tester la UICollectionViewLayout:Lorsque UICollectionViewLayer est défini, cellForItemAt n'est pas appelé

required init?(coder aDecoder: NSCoder) 
{ 
    super.init(coder: aDecoder) 
    xibSetup() 

    self.collectionView.register(UINib(nibName: "StepCell", bundle: nil), forCellWithReuseIdentifier: stepCellIdentifier) 
    self.collectionView.delegate = self 
    self.collectionView.dataSource = self 
} 

func numberOfSections(in collectionView: UICollectionView) -> Int { 
    return 3 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 100 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    if let lCell = collectionView.dequeueReusableCell(withReuseIdentifier: stepCellIdentifier, for: indexPath) as? StepCell { 
     lCell.text.text = indexPath.row.description 
     return lCell 
    } 
    return UICollectionViewCell() 
} 

J'ai une coutume UICollectionViewCell dans un autre xib et voici ma classe UICollectionViewLayout:

class DetailGroupCollectionviewLayout: UICollectionViewLayout { 
    let CELL_HEIGHT = 30.0 
    let CELL_WIDTH = 100.0 

    var cellAttrsDictionary = Dictionary<IndexPath,UICollectionViewLayoutAttributes>() 
    var contentSize = CGSize.zero 

    override var collectionViewContentSize: CGSize { 
     return self.contentSize 
    } 

    override func prepare() { 
     if let lCollectionView = self.collectionView { 
      if lCollectionView.numberOfSections > 0 { 
       for section in 0...lCollectionView.numberOfSections - 1 { 
        if lCollectionView.numberOfItems(inSection: section) > 0 { 
         for item in 0...lCollectionView.numberOfItems(inSection: section) - 1 { 
          let cellIndex = IndexPath(item: item, section: section) 
          let xPos = Double(item) * CELL_WIDTH 
          let yPos = Double(section) * CELL_HEIGHT 

          let cellAttributes = UICollectionViewLayoutAttributes(forCellWith: cellIndex) 
          cellAttributes.frame = CGRect(x: xPos, y: yPos, width: CELL_WIDTH, height: CELL_HEIGHT) 
          cellAttributes.zIndex = 1 

          cellAttrsDictionary[cellIndex] = cellAttributes 
         } 
        } 
       } 
      } 
     } 
    } 
} 

J'ai essayé d'avoir tout sur le UICollectionView dans le storyboard parce que je pensais qu'un xib "bug" mais cela ne résout rien.

Il y a une chose que je ne fais pas correctement ou une particularité? Je suis perdu.

Je suis sur Xcode 8.3 avec Swift 3.1 et mon application est sur iOS 10.

Répondre

0

je trouve la solution, mon habitude UICollectionViewLayout n'a pas contentSize, j'ai ajouté dans ma fonction prepare():

let contentWidth = Double(collectionView!.numberOfSections) * CELL_WIDTH 
let contentHeight = Double(collectionView!.numberOfItems(inSection: 0)) * CELL_HEIGHT 
self.contentSize = CGSize(width: contentWidth, height: contentHeight) 

This is the result

0

Êtes-vous sûr que votre ReuseIdentifier est correcte? Avez-vous essayé si elle se trouve à l'intérieur du si laissé ici? (avec une déclaration d'impression ou un point d'arrêt)?

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    if let lCell = collectionView.dequeueReusableCell(withReuseIdentifier: stepCellIdentifier, for: indexPath) as? StepCell { 
     lCell.text.text = indexPath.row.description 
     return lCell 
    } 
    return UICollectionViewCell() 
} 

Pas vraiment sûr de ce qu'il pourrait être, si vous pouvez partager votre projet, ou une partie de celui-ci, je vais essayer de le comprendre volontiers avec vous. En outre, assurez-vous que vous vous conformez à UICollectionViewDataSource et UICollectionViewDelegate.

0

Avez-vous attribué le délégué au viewController? Cela pourrait être une possibilité. (Si ce n'est pas le cas, "numberOsSections" ne sera pas appelé non plus.)

0

L'identificateur ReuseIdentifier est correct.Le problème est que cellForItemAt ne s'appelle pas lorsque j'ajoute l'UICollectionViewLayout, alors que ce n'est pas le cas. UICollectionView fonctionner parfaitement.

Without UICollectionViewLayout

With UICollectionViewLayout

Quelque chose que j'oublié de vous dire, peu importe quand UICollectionViewLayout est réglé ou non, mon xibController aller dans « numberOfItemsInSection » et « NumberOfSections » bu seulement quand le UICollectionViewLayout est défini, le con Troller passe pas dans le cellForItemAt