【问题标题】:State not updating correctly in SwiftUISwiftUI 中的状态未正确更新
【发布时间】:2020-07-21 10:09:24
【问题描述】:

我正在尝试实现喜欢和不喜欢按钮,以允许用户喜欢和不喜欢卡片。当用户喜欢一个按钮时,id 会被保存,并且图标会从心形变为实心。我可以正确保存id,但问题是有时图标不会切换到填充的图标以向用户显示更改,尤其是在选择第一个之后。随后的卡片不会改变状态但保持不变,同时它将正确添加保存id。为了能够看到我必须看到的另一张卡片,与第一张卡片不同,它可以同时显示两者。 ObservableEnvironmental 我都试过了。

我的班级处理喜欢和不喜欢

import Foundation
import Disk

class FavouriteRest: ObservableObject {
    @Published private var fav = [Favourite]()
    
    init() {
        getFav()
    }
    
    func getFav(){
        if let retrievedFav = try? Disk.retrieve("MyApp/favourite.json", from: .documents, as: [Favourite].self) {
            fav = retrievedFav
        } else {
            print("")
        }
    }
    
    
    //Get single data
    func singleFave(id: String) -> Bool {
        for x in fav {
            if id == x.id {
               return true
            }
            return false
        }
        return false
    }
    
    func addFav(favourite: Favourite){
        if singleFave(id: favourite.id) == false {
            self.fav.append(favourite)
            self.saveFave()
        }
    }
    
    //Remove Fav
    func removeFav(_ favourite: Favourite) {
        if let index = fav.firstIndex(where: { $0.id == favourite.id }) {
            fav.remove(at: index)
            saveFave()
        }
    }
    
    //Save Fav
    func saveFave(){
        do {
            try Disk.save(self.fav, to: .documents, as: "SmartParking/favourite.json")
        }
        catch let error as NSError {
            fatalError("""
                Domain: \(error.domain)
                Code: \(error.code)
                Description: \(error.localizedDescription)
                Failure Reason: \(error.localizedFailureReason ?? "")
                Suggestions: \(error.localizedRecoverySuggestion ?? "")
                """)
        }
    }
    
}

单卡

@EnvironmentObject var favourite:FavouriteRest

            HStack(alignment: .top){
                VStack(alignment: .leading, spacing: 4){
                    Text(self.myViewModel.myModel.title)
                        .font(.title)
                        .fontWeight(.bold)
                    Text("Some text")
                        .foregroundColor(Color("Gray"))
                        .font(.subheadline)
                        .fontWeight(.bold)
                }
                Spacer()
                VStack{
                    self.favourite.singleFave(id: self.myViewModel.myModel.id) ? Heart(image: "suit.heart.fill").foregroundColor(Color.red) : Heart(image: "suit.heart").foregroundColor(Color("Gray"))
                }
                .onTapGesture {
                    if self.favourite.singleFave(id: self.myViewModel.myModel.id) {
                        self.favourite.removeFav(Favourite(id: self.myViewModel.myModel.id))
                    } else {
                        self.favourite.addFav(favourite: Favourite(id: self.myViewModel.myModel.id))
                    }
                }
            }

【问题讨论】:

  • 我相信这是因为您显示任一图像的条件不依赖于任何状态,而是一个函数:func singleFave()。由于没有状态更改,因此不会重新计算 VStack 的主体。
  • 当我第一次选择它工作正常。
  • 我认为您的singleFave 函数有错误。一旦看到不匹配的 id,它就会返回 false。我认为中间的return falsefor 循环内的那个)不应该存在(如果我正确理解了您的代码)
  • 我试试修改看看能不能解决问题

标签: ios swift swiftui state combine


【解决方案1】:

我可以通过在卡片视图中移动代码并使用@States 来解决问题,如下所示。

    @State private var fav = [Favourite]()
    @State var liked = false
    VStack{
       // Heading
       HStack(alignment: .top){
          VStack{
            self.liked ? Heart(image:"suit.heart.fill").foregroundColor(Color.red) : Heart(image: "suit.heart").foregroundColor(Color("Gray"))
                        }
                        .onTapGesture {
               if self.liked {
               self.removeFav(self.singleFav!)
            } else {
                   let faveID = self.myViewModel.myModel.id
                   let myFav = Favourite(id:faveID)
                   self.fav.append(myFav)
                   self.saveFave()
           }
        }
   }

在获取和删除的方法中,我更新了@State var liked。现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2022-10-15
    • 2019-06-02
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多