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

如何在Xcode Swift中用UserDefaults持久化存储开关按钮状态

解决用UserDefaults保存点赞按钮状态的问题

我来帮你完善代码,实现用UserDefaults持久化保存点赞按钮的状态,下次打开页面时能自动恢复之前的选择:

完整代码示例

import UIKit

class LawFigure: UIViewController {
    // Outlets:
    @IBOutlet weak var likeButton: UIButton!
    
    // Variables:
    var isButtonOn = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        customiseUI()
        // 从UserDefaults加载之前保存的状态
        loadButtonState()
        // 根据加载的状态更新按钮UI
        updateLikeButtonUI()
    }
    
    func customiseUI() {
        likeButton.layer.borderWidth = 3.0
        likeButton.layer.borderColor = UIColor(red: 0/255, green: 166/255, blue: 221/255, alpha: 1.0).cgColor
        likeButton.layer.cornerRadius = 20.0
        // 给按钮绑定点击事件(如果Storyboard没关联的话)
        likeButton.addTarget(self, action: #selector(likeButtonTapped), for: .touchUpInside)
    }
    
    // 按钮点击响应方法
    @objc func likeButtonTapped() {
        // 切换按钮状态
        isButtonOn.toggle()
        // 更新按钮外观
        updateLikeButtonUI()
        // 把新状态保存到UserDefaults
        saveButtonState()
    }
    
    // 根据状态更新按钮UI样式
    func updateLikeButtonUI() {
        if isButtonOn {
            // 已点赞状态:填充背景色+实心图标
            likeButton.backgroundColor = UIColor(red: 0/255, green: 166/255, blue: 221/255, alpha: 1.0)
            likeButton.setImage(UIImage(systemName: "heart.fill"), for: .normal)
            likeButton.tintColor = .white
        } else {
            // 未点赞状态:边框样式+空心图标
            likeButton.backgroundColor = .clear
            likeButton.setImage(UIImage(systemName: "heart"), for: .normal)
            likeButton.tintColor = UIColor(red: 0/255, green: 166/255, blue: 221/255, alpha: 1.0)
        }
    }
    
    // 保存状态到UserDefaults
    func saveButtonState() {
        UserDefaults.standard.set(isButtonOn, forKey: "LawFigureLikeButtonState")
        // 手动同步(可选,默认系统会自动同步,手动调用更保险)
        UserDefaults.standard.synchronize()
    }
    
    // 从UserDefaults加载历史状态
    func loadButtonState() {
        // 如果是第一次打开,bool(forKey:)会默认返回false,符合初始状态
        isButtonOn = UserDefaults.standard.bool(forKey: "LawFigureLikeButtonState")
    }
}

关键逻辑说明

  • 状态加载:在页面初始化时调用loadButtonState,从UserDefaults读取之前保存的布尔值,确保打开页面时按钮状态和上次离开时一致。
  • 状态切换与保存:点击按钮时先切换isButtonOn的状态,更新UI后立即把新状态存入UserDefaults,用唯一的key(比如"LawFigureLikeButtonState")区分不同页面的按钮状态,避免冲突。
  • UI适配:updateLikeButtonUI方法根据状态切换按钮的外观,你可以根据需求修改这里的逻辑——比如用文字代替图标,或者更换其他颜色样式。

小提示

如果你的按钮是用文字展示状态(比如"点赞"/"已点赞"),只需要把updateLikeButtonUI里的setImage换成setTitle即可,比如:

if isButtonOn {
    likeButton.setTitle("已点赞", for: .normal)
} else {
    likeButton.setTitle("点赞", for: .normal)
}

内容的提问来源于stack exchange,提问作者ameerah fayez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:28:44