Swift开发求助:实现可恢复图片视图背景色的撤销按钮
问题分析
- 现有代码逻辑顺序错误:生成新随机色后直接将新色赋值给
previousColor变量,导致该变量存储的永远是当前正在显示的颜色,而非上一次生效的颜色,点击撤销无法回到上一步状态。
单步撤销修复方案
调整随机按钮点击事件中的赋值顺序,在生成新颜色前先存储当前正在显示的颜色即可:
var previousColor: UIColor? @IBAction func didPressRandomButton(_ sender: Any) { // 先存储当前显示的颜色作为撤销备用 previousColor = imageDisplay.backgroundColor let randomRed = CGFloat.random(in: 0...1) let randomGreen = CGFloat.random(in: 0...1) let randomBlue = CGFloat.random(in: 0...1) let color = UIColor(red: randomRed, green: randomGreen, blue: randomBlue, alpha: 1) imageDisplay.backgroundColor = color } @IBAction func didPressUndoButton(_ sender: Any) { guard let undoColor = previousColor else { return } imageDisplay.backgroundColor = undoColor }
多步撤销可选优化
如果需要支持多次点击撤销、依次回溯更早的颜色,可以用数组作为历史栈存储所有过往颜色:
// 颜色历史栈,存储所有生效过的颜色 var colorHistory: [UIColor] = [] @IBAction func didPressRandomButton(_ sender: Any) { if let currentColor = imageDisplay.backgroundColor { colorHistory.append(currentColor) } let randomRed = CGFloat.random(in: 0...1) let randomGreen = CGFloat.random(in: 0...1) let randomBlue = CGFloat.random(in: 0...1) let color = UIColor(red: randomRed, green: randomGreen, blue: randomBlue, alpha: 1) imageDisplay.backgroundColor = color } @IBAction func didPressUndoButton(_ sender: Any) { guard !colorHistory.isEmpty else { return } let lastColor = colorHistory.removeLast() imageDisplay.backgroundColor = lastColor }
内容的提问来源于stack exchange,提问作者Jon Cina
相关产品推荐
相关产品推荐

