You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用UIColorPickerViewController修改单元格背景色始终显示黑色

解决UIColorPickerViewController选择颜色后单元格背景不更新的问题

我正在开发一款学生成绩分析应用,允许用户创建课程并自定义TableView单元格的显示样式。现在遇到的问题是:点击单元格中的颜色按钮弹出UIColorPickerViewController后,单元格背景立刻变黑,选择颜色并退出后,单元格还是保持黑色。调试发现颜色值确实存入了变量,但赋值操作发生在变量被设置之前。

问题原因

  • 在didTapButton方法中,弹出颜色选择器后手动调用了colorPickerViewControllerDidFinish,此时用户还未选择颜色,cellBackgroundColor的初始值(大概率为nil,对应显示黑色)被直接赋值给单元格背景。
  • 未保存当前操作的单元格视图引用,用户完成颜色选择时,无法定位到对应单元格进行更新。
  • 未将选择的颜色存入数据源,TableView单元格复用后,颜色会丢失。

修复步骤及代码修改

1. 在视图控制器中添加必要变量

在ClassSelection类中添加,用于保存当前操作的单元格视图和课程数据源:

// 保存当前正在修改颜色的单元格视图
private var currentEditingCellView: UIView?

// 假设的课程数据源模型(需根据实际需求定义)
struct Course {
    let name: String
    let teacher: String
    var color: UIColor
    // 其他课程属性...
}
// 课程数组数据源
var courses: [Course] = []

2. 修改newlyCreatedCellDelegate实现

移除手动调用代理方法的错误代码,改为保存当前单元格视图:

extension ClassSelection: newlyCreatedCellDelegate {
    func didTapButton(title: String, cellView: UIView) {
        let colorPickerVC = UIColorPickerViewController()
        colorPickerVC.delegate = self
        // 保存当前要修改的单元格视图
        currentEditingCellView = cellView
        // 设置颜色选择器初始选中色为当前单元格背景色
        colorPickerVC.selectedColor = cellView.backgroundColor ?? .white
        
        present(colorPickerVC, animated: true, completion: nil)
    }
}

3. 修改UIColorPickerViewControllerDelegate实现

在颜色选择完成后,更新单元格背景色并同步到数据源:

extension ClassSelection: UIColorPickerViewControllerDelegate {
    func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
        let selectedColor = viewController.selectedColor
        // 更新当前单元格的背景色
        currentEditingCellView?.backgroundColor = selectedColor
        
        // 找到对应课程,更新数据源中的颜色(避免单元格复用后丢失)
        if let cell = currentEditingCellView?.superview?.superview as? newlyCreatedClass,
           let className = cell.classNameLabel.text,
           let index = courses.firstIndex(where: { $0.name == className }) {
            courses[index].color = selectedColor
        }
        
        // 清空临时引用
        currentEditingCellView = nil
    }
}

4. 确保TableView数据源方法正确设置颜色

在cellForRowAt方法中,从数据源读取颜色并赋值给单元格:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier", for: indexPath) as! newlyCreatedClass
    let course = courses[indexPath.row]
    
    // 设置课程基本信息
    cell.classNameLabel.text = course.name
    cell.classTeacherNameLabel.text = course.teacher
    // ...其他属性设置
    
    // 设置单元格背景色
    cell.classUIView.backgroundColor = course.color
    
    return cell
}

关键说明

  • 禁止手动调用系统代理方法(如colorPickerViewControllerDidFinish),此类方法由系统在特定时机自动触发。
  • 必须将选择的颜色存入数据源,否则TableView单元格复用后,自定义颜色会被默认样式覆盖。
  • 通过保存当前单元格视图的引用,确保颜色选择完成后能精准定位到目标单元格进行更新。

内容的提问来源于stack exchange,提问作者Quinn C.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:35:19