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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 15:33:04