isHighlighted和isSelected didSet仅调用UICollectionViewCell而不是UITableViewCell

时间:2018-01-30 01:24:55

标签: ios swift uitableview uicollectionviewcell

我想在高亮/选择时将一些样式更改应用于自定义表格视图单元格,因此请覆盖isHighlightedisSelected来实现此目的。它适用于我的自定义集合视图单元格,但不适用于我点击自定义表格视图单元格。

我为表视图和集合视图设置了完全相同的场景,并在自定义单元格上实现了以下内容:

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

我在这里缺少什么?为什么桌面视图单元格没有被点击时被调用?无论自定义单元格的内容如何,​​我尝试使用的任何表视图都会发生这种情况。

3 个答案:

答案 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
}