如何使选定的单元格为自定义单元格 UITableViewCell 变成不同的颜色

Posted

技术标签:

【中文标题】如何使选定的单元格为自定义单元格 UITableViewCell 变成不同的颜色【英文标题】:How to make selected cell turn a different color for custom cells UITableViewCell 【发布时间】:2020-07-11 16:02:48 【问题描述】:

我想让选定的单元格成为特定颜色 (UIColor.systemGray)。我已经尝试了几乎所有的答案,但由于某种原因,我的细胞无法正常工作。

这是我的视图控制器类的一部分:

extension CommunicationViewController: UITableViewDataSource, UITableViewDelegate 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return communicationcells.count
    

    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        
        let communicationCell = communicationcells[indexPath.row]
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "CommunicationCell") as! CommunicationCell

        cell.backgroundButton.tag = indexPath.row
        cell.backgroundButton.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)

        cell.setCommunication(communication: communicationCell)
        return cell
        
    

    
    
    struct Holder 
        static var _myComputedProperty:Int = -1
    
    var myComputedProperty:Int 
        get 
            return Holder._myComputedProperty
        
        set(newValue) 
            Holder._myComputedProperty = newValue
        
    
    


    @objc func buttonTapped(_ sender: UIButton) 
        myComputedProperty = sender.tag
        performSegue(withIdentifier: "CommunicationSegue", sender: self)
        
    
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        let detailsController = segue.destination as! CommunicationDetailsViewController
        detailsController.passthroughstring = String(myComputedProperty)
        
        
        
    
    
    
    
    

这是我的通信单元控制器:


class CommunicationCell: UITableViewCell 
    
    @IBOutlet var backgroundcontentView: UIView!
    
    @IBOutlet weak var CommunicationType: UILabel!
    
    @IBOutlet weak var subject: UILabel!
    
    @IBOutlet weak var partnerType: UILabel!
    @IBOutlet weak var partnerID: UILabel!
    @IBOutlet weak var effectiveFrom: UILabel!
    @IBOutlet weak var effectiveTo: UILabel!
    @IBOutlet weak var downtimeFrom: UILabel!
    @IBOutlet weak var downtimeTo: UILabel!
    
    @IBOutlet weak var backgroundButton: UIButton!
    
    @IBOutlet var collectionOfCommunicationLabels: Array<UILabel>!
    
    
    func applyTheme() 
        for i in 0..<collectionOfCommunicationLabels.count 
        collectionOfCommunicationLabels[i].textColor = Theme.current.textColor
            collectionOfCommunicationLabels[i].backgroundColor = Theme.current.backgroundColor
        
        backgroundcontentView.backgroundColor = Theme.current.backgroundColor
        CommunicationType.textColor = Theme.current.textColor
        subject.textColor = Theme.current.textColor
        partnerType.textColor = Theme.current.textColor
        partnerID.textColor = Theme.current.textColor
        effectiveFrom.textColor = Theme.current.textColor
        effectiveTo.textColor = Theme.current.textColor
        downtimeFrom.textColor = Theme.current.textColor
        downtimeTo.textColor = Theme.current.textColor
//        backgroundButton.backgroundColor = Theme.current.backgroundColor
        
    
    

    
    func setCommunication(communication: Communication) 
        CommunicationType.text = communication.communicationType
        subject.text = communication.subject
        partnerType.text = communication.partnerType
        partnerID.text = communication.partnerID
        effectiveFrom.text = communication.effectiveFrom
        effectiveTo.text = communication.effectiveTo
        downtimeFrom.text = communication.downtimeFrom
        downtimeTo.text = communication.downtimeTo
        applyTheme()
        
    
    

我已经尝试了几乎所有关于堆栈溢出的答案,但对我没有任何帮助。

【问题讨论】:

使用 tableView 委托 didSelectRowAt indexPath 而不是使用按钮作为背景视图。 【参考方案1】:

除了 cellForRowAtIndexPath 方法之外,您能否尝试实现 didSelectRowAtIndexPath 方法?在这种情况下,您将不需要背景按钮,并且您将在 didSelectRowAtIndexPath 方法中在点击 tableview 中的任何行时获得回调。


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let selectedCell = tableView.cellForRow(at: indexPath)
    selectCell.backgroundColor = .red //change to any color you want it to change to on selection
    performSegue(withIdentifier: "CommunicationSegue", sender: self)


【讨论】:

那我该放什么来代替背景按钮呢?我将如何调用该函数来执行 segue。 @BobStone 你可以用上面提到的同样的方法添加它(我已经做了相应的编辑) 我试过了,但 backgroundColor 仍然没有改变。 尝试删除背景按钮和背景内容视图以便您能够看到它 我想通了。我使用 didhighlight 和 didunhighlight 进行颜色更改,但仍然使用 selected 进行 segue 更改。最大的问题是按钮。我仍然会赞成将我引向正确的答案。谢谢!

以上是关于如何使选定的单元格为自定义单元格 UITableViewCell 变成不同的颜色的主要内容,如果未能解决你的问题,请参考以下文章

在点击之前如何使JTable中的单元格为空?

UITableView 选定的单元格在滚动时不会保持选中状态

Swift Cocoa Touch 自定义单元格为 IBOutlets 返回 nil

使附件类型成为选定单元格的复选标记

为自定义单元格调用 didSelectRowAt 索引

如何拥有两个具有两个不同高度的独立单元? [复制]