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

SwiftUI中如何持久化保存按钮的选中状态与颜色?

实现爱心按钮状态持久化(重启应用保留状态)

直接把父视图里的@State替换成@AppStorage就能实现状态持久化,不需要手动操作UserDefaults,具体修改如下:

修改后的完整代码

struct HeartButtonView: View {
    // 用@AppStorage替换@State,指定存储key,自动持久化到UserDefaults
    @AppStorage("isHeartLiked") private var isLiked = false
    var body: some View {
        HeartButton(isLiked: $isLiked)
    }
}

struct HeartButton: View {
    @Binding var isLiked: Bool
    @State private var animate = false
    private let animationDuration: Double = 0.1
    private var animationScale: CGFloat {
        isLiked ? 0.7 : 1.3
    }
    
    var body: some View {
        Button {
            self.animate = true
            DispatchQueue.main.asyncAfter(deadline: .now() + self.animationDuration) {
                self.animate = false
                self.isLiked.toggle()
            }
        } label: {
            Image(systemName: isLiked ? "heart.fill" : "heart")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 50)
                .foregroundColor(isLiked ? .red : .gray)
        }
        .scaleEffect(animate ? animationScale : 1)
        .animation(.easeIn(duration: animationDuration), value: animate)
    }
}

关键说明

  • @AppStorage("isHeartLiked"):这个属性包装器会自动把isLiked的值存在UserDefaults里,key设为isHeartLiked确保唯一,重启应用时会自动读取该key对应的初始值
  • 子视图的@Binding无需改动,依然负责接收父视图的状态绑定、处理点击动画逻辑
  • 点击按钮触发isLiked.toggle()时,状态会自动同步到UserDefaults,无需额外编写存储代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:20:22