根据索引为 tableview 单元格按钮提供不同的颜色。这在 WilldisplayCell 和 CellForROwAt 级别都不起作用

Posted

技术标签:

【中文标题】根据索引为 tableview 单元格按钮提供不同的颜色。这在 WilldisplayCell 和 CellForROwAt 级别都不起作用【英文标题】:give tableviewcell buttons different colors according to index. this did not work neither in WilldisplayCellAt nor at the CellForROwAt level 【发布时间】:2020-07-17 06:46:39 【问题描述】:

只有当我滚动浏览我的表格视图但加载和出现的第一个单元格没有采用所需的颜色时,此代码才能正常工作。我尝试在 CellforRowAt 和 CellWillDisplayAt 中调用 func 并且都具有相同的效果

让我抓狂的是 backgroundview 正确地采用了颜色,但按钮标题颜色仅在滚动时对第一个单元格生效,并且视图和按钮的代码在同一个函数中实现

我从 XIB 文件加载单元格的类扩展

扩展 MyPlansTableViewCellPresenter : UITableViewDataSource

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return items.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! MyPlansTableViewCell
    return cell


func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
    let newcell = cell as! MyPlansTableViewCell
    newcell.setCellColors(index: indexPath.row)
    //This code works fine ONLY when i sroll through my table view but the first cell that loads and appear are not taking the needed colors. 


我的单元格是在一个 XIB 文件中设计并加载在那里的,这是它的类

class MyPlansTableViewCell: UITableViewCell 

@IBOutlet weak var renewBtn: UIButton!
@IBOutlet weak var upgradePlanBtn: UIButton!

override func awakeFromNib() 
    super.awakeFromNib()
    // Initialization code


override func layoutSubviews() 
    super.layoutSubviews()


override func setSelected(_ selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)



public func setCellColors(index: Int)
    if index % 2 == 0 
        upgradePlanBtn.titleLabel?.textColor = .TextColor
        holderView.backgroundColor = .TextColor
     else if index % 2 == 1 
        upgradePlanBtn.titleLabel?.textColor = .systemYellow
        holderView.backgroundColor = .systemYellow
    

【问题讨论】:

什么是holderView?我在 MyPlansTableViewCell 中没有看到任何具有该名称的变量 Holderview 是一个正在改变蓝色和黄色的视图,抱歉,我尝试提交尽可能多的代码并显示所需的代码,因此持有者视图正在加载并正常运行,但文本 ib 按钮仅在滚动后立即加载的前三个单元格都正常工作。 【参考方案1】:

试试这个!!

public func setCellColors(index: Int)
if index % 2 == 0 
    upgradePlanBtn.setTitleColor(.TextColor, for: .normal)
    holderView.backgroundColor = .TextColor
 else if index % 2 == 1 
    upgradePlanBtn.setTitleColor(.systemYellow, for: .normal)
    holderView.backgroundColor = .systemYellow

您必须使用此代码在代码中指定按钮的状态

upgradePlanBtn.setTitleColor(.systemYellow, for: .normal)

【讨论】:

这行得通,谢谢,但它有什么特别之处,我只是想知道。【参考方案2】:

如果你在绘图函数中设置颜色,它会起作用

override func draw(_ rect: CGRect) 
    super.draw(rect)

    //Your code here

【讨论】:

但这会添加到我的XIB文件中,我需要根据它们的索引加载单元格,它不固定 将索引添加为单元格内的属性并在单元格中设置

以上是关于根据索引为 tableview 单元格按钮提供不同的颜色。这在 WilldisplayCell 和 CellForROwAt 级别都不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 tableview 单元格中显示图像

Swift 试图为同一索引路径出列多个单元格,这是不允许的

JavaFX 2 TableView:根据单元格内的数据不同的单元格工厂

如何激活按钮以从 tableview 单元格(多个单元格)内部执行操作

tableview cellForRowAt indexPath 值没有在外面快速使用?

Swift 3.0 TableView 单元格按钮