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() }