使用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.
相关产品推荐
相关产品推荐

