我想在高亮/选择时将一些样式更改应用于自定义表格视图单元格,因此请覆盖isHighlighted
和isSelected
来实现此目的。它适用于我的自定义集合视图单元格,但不适用于我点击自定义表格视图单元格。
我为表视图和集合视图设置了完全相同的场景,并在自定义单元格上实现了以下内容:
override var isHighlighted: Bool {
didSet {
//called when I tap for CustomCollectionViewCell not for CustomTableViewCell
}
}
override var isSelected: Bool {
didSet {
//called when I tap for CustomCollectionViewCell not for CustomTableViewCell
}
}
我在这里缺少什么?为什么桌面视图单元格没有被点击时被调用?无论自定义单元格的内容如何,我尝试使用的任何表视图都会发生这种情况。
答案 0 :(得分:2)
另一个答案对我不起作用。我认为原因是当包含UITableViewCell.isSelected
处理选择时,永远不会调用UITableView
setter,而是通过func setSelected(_ selected: Bool, animated: Bool)
传递状态。这意味着在您的UITableViewCell
子类中替代此函数而不是setter可以起作用:
override func setSelected(_ selected: Bool, animated: Bool) {
// implementation that was meant to be in `isSelected` `didSet`
}
答案 1 :(得分:0)
通过这种方式覆盖这些属性,您不再使用其默认实现。
尝试将信息转发给super
:
override var isHighlighted: Bool {
get {
return super.isHighlighted
}
set {
//do something
super.isHighlighted = newValue
}
override var isSelected: Bool {
get {
return super.isSelected
}
set {
//do something
super.isSelected = newValue
}
}
答案 2 :(得分:0)
就我而言,我想更改按钮的背景,即集合视图中单元格的背景:
class CustomCVCell: UICollectionViewCell {
override var isSelected: Bool {
didSet {
grayBackgroundViewWithImage.image =
isSelected ? UIImage(named: "") : UIImage()
}
}
在存储集合视图的主类中创建这个变量:
class CustomViewController: UIViewController {
///save the indexPath of last selected cell
private var lastSelectedIndexPath: IndexPath? }
在 viewDidLoad() 中将此值设置为 false:
customCollectionView.allowsMultipleSelection = false
数据源中的进一步代码。就我而言,应该选择第一个单元格:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CustomCVCell.cellID(),
for: indexPath) as! CustomCVCell
if indexPath.row == 0 {
lastSelectedIndexPath = indexPath
cell.isSelected = true
}
//update last select state from lastSelectedIndexPath
cell.isSelected = (lastSelectedIndexPath == indexPath)
return cell
}
委托中的其他代码:
///UICollectionViewDelegate
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard lastSelectedIndexPath != indexPath else { return }
if let index = lastSelectedIndexPath {
let cell = collectionView.cellForItem(at: index) as! CustomCVCell
cell.isSelected = false
}
let cell = collectionView.cellForItem(at: indexPath) as! CustomCVCell
cell.isSelected = true
lastSelectedIndexPath = indexPath
}