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

