Swift:UICollectionViewCell didSelectItemAtIndexPath更改backgroundColor

我很容易能够在CellForItemAtIndexPath方法中更改单元格的背景颜色

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { cell.backgroundColor = UIColor.blackColor() } 

但是,当我尝试更改DidSelectItemAtIndexPath中的颜色不起作用。

 func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { let cell: ButtonCollectionCell = collectionView.dequeueReusableCellWithReuseIdentifier("ButtonCell", forIndexPath: indexPath) as! ButtonCollectionCell { cell.backgroundColor = UIColor.blackColor() 

}

另外我读的地方,使用didSelectItemAtIndexPath将无法正常工作,因为一旦集合视图开始滚动颜色将改变

什么是在Swift修复?

非常感谢你的帮助

你可以使用这个方法:

  func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){ var cell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)! cell.backgroundColor = UIColor.magentaColor() } 

老问题,但它可以帮助某人:

不能简单地修改单元格,因为当你滚动你的UICollectionView时,你的改变将会丢失,甚至最糟糕的是,其他单元格可能会出现错误的背景,因为它们将被重用。

所以,最好的方法是创build一个NSIndexPath数组并附加你select的indexPaths:

 var selectedIndexes = [NSIndexPath]() { didSet { collectionView.reloadData() } } func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){ // ... if let indexSelecionado = selectedIndexes.indexOf(indexPath) { selectedIndexes.removeAtIndex(indexSelecionado) } else { selectedIndexes.append(indexPath) } } // ... func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { // ... if self.selectedIndexes.indexOf(indexPath) == nil { cell.backgroundColor = UIColor.whiteColor() // Unselected } else { cell.backgroundColor = UIColor.redColor() // Selected } return cell } 
 cell.backgroundColor = UIColor.redColor() let startTime = DateUtils.getDispatchTimeByDate(NSDate(timeIntervalSinceNow: 0.1)) dispatch_after(startTime, dispatch_get_main_queue()) {[weak self] in //there is the code redirect to other viewcontroller openOtherVC() }