在这种情况下,如何使用自定义 tableView 单元格处理可重用单元格(从代码中的其他位置更改单元格背景颜色不起作用)

Posted

技术标签:

【中文标题】在这种情况下,如何使用自定义 tableView 单元格处理可重用单元格(从代码中的其他位置更改单元格背景颜色不起作用)【英文标题】:How do I handle reusable cells with custom tableView cells in this situation (changing cell background colour from other location in code not working) 【发布时间】:2021-01-04 22:49:34 【问题描述】:

我正在尝试根据我的情况处理出列可重用单元格。我不确定我是否在这里以最好的方式做事,我能够处理关于将单元格出列以获取自定义单元格中的文本标签的奇怪事情。我在单元格 xib 代码中使用 override func prepareForReuse() 处理了这个问题。但是,当我尝试以相同的方式处理单元格背景时,它并不能正常工作。我相信这是因为我在 tableView 函数之外的其他地方更改单元格背景...

所以问题是单元格背景没有像预期的那样发生变化,典型的出列可重用单元格问题。如果我将backgroundColor = nil 放在 prepareForReuse() 中,则根本不会显示背景。如果我忽略它,那么当我滚动时,背景颜色会在整个 tableView 上跳跃。

仅供参考,我已在 viewDidLoad() 中正确注册了单元格

我认为这足以解释这种情况。感谢任何指针:)

将单元格背景标记为红色

func markRED(cell: EntrantCell) 
    var timeOut: String 
        let currentDateTime = Date()
        let formatter = DateFormatter()
        formatter.timeStyle = .medium
        return formatter.string(from: currentDateTime)
    
    if let indexPath = self.entrantsTable.returnIndexPath(cell: cell) 
        entryStatusGrid[indexPath.row] = 2
        entrantTime[indexPath.row].append("OUT- \(timeOut)")
        entrantsTable.cellForRow(at: indexPath)?.backgroundColor = #colorLiteral(red: 0.7647058964, green: 0.01910983652, blue: 0.008289327978, alpha: 1)
        entrantsTable.reloadData()
    
    print(entrantTime)
    print(entryStatusGrid)
    
    // TODO: Handle proper space status for global button
    Entrant.updateStatus(entryStatusGrid: entryStatusGrid, button: spaceStatus)

TableView 扩展

extension EntrySession: UITableViewDataSource 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return entryGrid.count


// TODO: Handle proper deque for reusable cells
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    
    let addEntrantCell = entrantsTable.dequeueReusableCell(withIdentifier: Global.headerCellIdentifier, for: indexPath) as! AddEntrantCell
    let entrantCell = entrantsTable.dequeueReusableCell(withIdentifier: Global.bodyCellIdentifier, for: indexPath) as! EntrantCell
    
    if indexPath.row == 0 
        
        addEntrantCell.delegate = self
        addEntrantCell.entrantNameTextField.text = entryGrid[indexPath.row].name
        addEntrantCell.entrantCompanyTextField.text = entryGrid[indexPath.row].company
        return addEntrantCell
     else 
        
        entrantCell.delegate = self
        entrantCell.nameLabel.text = entryGrid[indexPath.row].name
        entrantCell.companyLabel.text = entryGrid[indexPath.row].company
        return entrantCell
    


自定义单元重用()

override func prepareForReuse() 
    super.prepareForReuse()
    name.text = nil
    status.text = nil
    backgroundColor = nil         // When i do this the background color does not change...


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


@IBAction func inButton(_ sender: UIButton) 
    delegate?.markRED(cell: self)

@IBAction func outButton(_ sender: UIButton) 
    delegate?.markBLUE(cell: self)

【问题讨论】:

【参考方案1】:

您需要始终将其设置为合适的值。

if shouldSetBackgroundColor 
    backgroundColor = .brown
 else 
    backgroundColor = nil

假设您只初始化了 4 个单元格。 然后显示 4 个单元格。假设所有人都将shouldSetBackgroundColor 设置为true。结果,您看到所有 4 个单元格的 backgroundColor 为 brown。到目前为止一切顺利。

现在是您的第 5 个单元格。如果您没有在单元格上将shouldSetBackgroundColor 设置为false,或者没有一些逻辑来更改backgroundColor 的颜色,那么由于单元格被重新使用,backgroundColor 不会改变。它将保持设置为brown...

【讨论】:

感谢您的输入亲爱的,但我有点菜鸟。这个 if 语句到底应该插入到哪里?还有“shoudSetBackgroundColor”,应该是我的协议方法markRED设置的全局布尔变量吗? 好问题。在您的cellForRowAtIndex 内。有关cellForRowAtIndexprepareForReuse 的更多信息,请参阅here。这个想法是,无论何时您想要设置单元格,您都必须假设单元格的所有特征都不是您想要的(因为它们是由使用它们的前一个单元格设置的,但不在屏幕之外)。因此需要你重新设置它 我担心我不得不将其放入cellForRowAtIndex。但这很好,这绝对有助于我对 tableView 的了解。而且资源也不错。谢谢

以上是关于在这种情况下,如何使用自定义 tableView 单元格处理可重用单元格(从代码中的其他位置更改单元格背景颜色不起作用)的主要内容,如果未能解决你的问题,请参考以下文章

如何更改自定义单元格的 UILabel 文本?

带有自定义 UIView 的 Tableview,添加标签重叠

如何在没有范围的情况下在 laravel 路由中使用自定义键?

iPhone自定义手机键盘重叠

如何链接两个xib?

IOS:在某些类中使用自定义单元格