我遇到了一个无法解决的问题.当用户点击按钮并取消选中时,如何保存按钮的 colored颜色 ?我有一个Collection 夹按钮,当用户单击它时, colored颜色 、SF符号和文本从"Collection 夹"更改为"Collection 夹".这很好.然而,当我离开屏幕时,一切都回到了原来的 colored颜色 .

这是我的密码.

import SwiftUI

struct CharacterDetailsView: View {
    
    //Need to reference for detail view by relying on the list to assign the details. 
 var character: Character
    
    @EnvironmentObject var favorites: Favorites
   
    
    @State private var isFavorited = false
  
    
    
    var favoriteText: String {
        if isFavorited  {
            return "Favorited"
        } else {
            return "Favorite"
        }
    }
    
    var favoriteButton: some View {
        Button {
            isFavorited.toggle()
           
            
            if favorites.contains(character) {
                //If favorites contains a character, we are trying to un-favorite and remove it
                favorites.remove(character)
            } else {
                favorites.add(character)
            }
           
        } label: {
            ZStack {
                if isFavorited == false {
                    Capsule()
                        .strokeBorder(Color.green, lineWidth: 4)
                        .frame(width: 250, height: 50)
                        .background(
                            Capsule()
                                .fill(.green)
                                .cornerRadius(20)
                        )
                
                } else {
                    Capsule()
                        .strokeBorder(Color.blue, lineWidth: 4)
                        .frame(width: 250, height: 50)
                        .background(
                        Capsule()
                            .fill(.blue)
                            .cornerRadius(20)
                        )
                        
                }
                
                HStack {
                    Text(favoriteText)
                        .foregroundColor(.white)
                    Image(systemName: favorites.contains(character) ? "heart.fill" : "heart")
                        .foregroundColor(favorites.contains(character) ? .white : .white)
                        
                }
            }
        }
        .padding(.vertical)
    }
 
    
    var body: some View {
        ScrollView {
            VStack {
                //MARK: - Image
                AsyncImage(url: URL(string: character.image)) {
                    phase in
                    if let image = phase.image {
                        image
                            .resizable()
                            .scaledToFit()
                    } else if phase.error != nil {
                        Text("Couldn't upload photo")
                    } else {
                        ProgressView()
                    }
                }
            

                VStack(alignment: .leading) {
                    Text(character.name)
                        .font(.largeTitle)
                        .bold()
                        .padding(.leading)
                       
                    
                    Section {
                        SubDetailView(sfImageString: "checkmark.circle", infoText: "Status", detailText: character.status)
                        
                        SubDetailView(sfImageString: "person.circle", infoText: "Species", detailText: character.species)
                       
                        SubDetailView(sfImageString: "house.circle", infoText: "Origin", detailText: character.origin.name)
                        
                        SubDetailView(sfImageString: "mappin.circle", infoText: "Location", detailText: character.location.name)
                    }
                    .padding(.horizontal)

                }
                
           
            favoriteButton
             
               

                
            }
        }
       
    }
    
    
  
}

推荐答案

您需要从存储提供的环境对象恢复状态,如

favoriteButton
   .onAppear {
      isFavorite = favorites.contains(character)    // << here !!
   }

Ios相关问答推荐

UIBezierPath包含:方法不检测到厚度大于1像素的线上的touch

我如何确保用户继续他们在应用程序中停止的地方?

JSON响应中的键有时为Int,有时为字符串

Flutter应用内购买无法恢复购买

封装 Swift 导入

为什么 Swift 不在启动的同一线程上恢复异步函数?

无法在 CollectionView 中禁用部分弹跳 - 组合布局

为什么@FetchRequest 在删除时不更新和重绘视图?

如何在 SwiftUI 的 TabView 中添加底部曲线?

包装在 AnyView 中时 UIViewControllerRepresentable 无法正常工作

帧过渡动画有条件地工作

SwiftUI 中的偏移量和按钮有问题吗?

用溢出的长文本对齐 Flutter 中的行和列

如何根据设备时间设置 Flutter 应用时间线?

带有属性包装器的不可用属性

通过隐藏和显示视图在 iMessage 应用程序中使用不同的视图

每个版本的 iOS 都附带什么版本的移动 Safari?

使用 Xcode 4 的 iPhone 临时构建

使用 Xcode 的 All Exceptions 断点时忽略某些异常

NSURL 到带有 XCTest 的测试包中的文件路径