我使用UICollectionview呈现4个按钮,用户应该选择1个按钮。 我创建了 uibutton的自定义子类:
class CustomButton: UIButton {
override var isSelected: Bool{
didSet{
backgroundColor = isSelected ? Constants.Colors.selectedMenu: Constants.Colors.menuCell
}
}
}
自定义单元格类:
class SymptomCell: UICollectionViewCell {
@IBOutlet weak var optionButton1: UIButton!
@IBOutlet weak var optionButton2: UIButton!
@IBOutlet weak var optionButton3: UIButton!
@IBOutlet weak var optionButton4: UIButton!
func configCell(options : [String]){
optionButton1.setTitle(options[0], for: .normal)
optionButton2.setTitle(options[1], for: .normal)
optionButton3.setTitle(options[2], for: .normal)
optionButton4.setTitle(options[3], for: .normal)
}
@IBAction func clickAction(_ sender: UIButton) {
sender.isSelected = sender.isSelected ? false : true
}
}
我看到了例如,如果我选择按钮并滚动几个单元格,那么即使我没有按下它,同一索引中的按钮也会获得不同的背景颜色。
在我尝试使用的单元格类中:
override func prepareForReuse() {
optionButton1.isSelected = false
optionButton2.isSelected = false
// ...
}
但每次都会取消选择所有项目。 我该怎么办?
答案 0 :(得分:2)
UIView
内的任何UICollectionViewCell
必须在单元格重用之间无状态,因此,您必须保留prepareForReuse
函数。
但是,UICollectionViewCell
本身在以前选择的isSelected
重用时会恢复其indexPath
状态。
因此,方法可以是与按钮一起选择单元格。 你的单元格应该是这样的:
protocol MyCellDelegate : NSObjectProtocol {
func optionButton1DidToggle(in cell: UICollectionViewCell?)
}
class MyCell: UICollectionViewCell {
var delegate : MyCellDelegate?
@IBAction func clickAction(_ sender: UIButton) {
// you can assign delegate to your cell, the same as UICollectionViewDelegate, and forward here click callback to your delegate,
delegate?.optionButton1DidToggle(in: self)
//.....
}
override var isSelected: Bool {
didSet{
optionButton1.isSelected = self.isSelected
}
}
override func prepareForReuse() {
optionButton1.isSelected = false
}
}
MyCellDelegate
实施:
public func optionButton1DidToggle(in cell: UICollectionViewCell?) {
if !cell.optionButton1.isSelected {
collectionView.selectItem(at: collectionView.indexPath(for: cell) animated:false scrollPosition:.centeredHorizontally)
} else {
collectionView.deselectItem(at: collectionView.indexPath(for: cell) animated:false)
}
}
答案 1 :(得分:-1)
尝试在自定义单元格中使用prepareForReuse并设置backgroundColor = nil
override func prepareForReuse() {
backgroundColor = nil
optionButton1.isSelected = false
}