0

VIPER アーキテクチャを使用して SwiftUI でプロジェクトを作成していますが、.onTapGesture を呼び出した後にイメージが更新されないという問題に直面しました。この機能に関連するコード ブロックは次のとおりです。

モデル:

class FavoriteBeers{
    var favoriteBeers = [Beer]()
}

インタラクター:

func addToFavorites(beer: Beer){
        favoriteBeers.favoriteBeers.append(beer)
        saveFavoriteBeers()
    }
func removeFromFavorites(_ beer: Beer) {
        favoriteBeers.favoriteBeers.removeAll { $0 == beer }
        saveFavoriteBeers()
    }
func isFavorite(_ beer: Beer) -> Bool {
        favoriteBeers.favoriteBeers.contains(beer)
    }

プレゼンター:

func favoritesButton(_ beer: Beer) -> String{
    if isFavorite(beer){
        return SystemImages.FilledStar.rawValue
    }else{
        return SystemImages.EmptyStar.rawValue
    }
}

 private func isFavorite(_ beer: Beer) -> Bool{
    return interactor.isFavorite(beer)
}

func addOrRemoveFromFavorites(_ beer: Beer){
    if isFavorite(beer){
        print("now not favourite")
        interactor.removeFromFavorites(beer)
    }else{
        print("now favourite")
        interactor.addToFavorites(beer: beer)
    }
}

意見:

struct BeersListView: View{
    @StateObject var presenter : BeersListPresenter
    var body: some View {
        NavigationView{
            List{
                ForEach(presenter.beers, id: \.id){ beer in
                    HStack{
                        VStack(alignment: .leading){
                            Text(beer.name)
                                .font(.headline)
                            Text("Vol: \(presenter.formattedABV(beer.abv))")
                                .font(.subheadline)
                            
                        }
                        
                        Spacer()
                        
                        Image(systemName: presenter.favoritesButton(beer))
                            .frame(width: 13, height: 13)
                            .foregroundColor(.yellow)
                            .onTapGesture {
                                withAnimation{
                                    presenter.addOrRemoveFromFavorites(beer)
                                }
                            }
                    }
                }
            }.onAppear{
                presenter.loadList(at: 1)
            } .listStyle(GroupedListStyle())
                .navigationBarTitle("All beers")
        }
    }
}

そして結果は見る

しかし、スターボタンをタップすると、「今はお気に入り/今はお気に入りではありません」と表示されますが、画像は変わりません。前もって感謝します!

4

2 に答える 2

0

あなたの中で使ってみてDispatchQueue.main.async { presenter.addOrRemoveFromFavorites(beer) }ください.onTapGesture

于 2021-12-17T23:34:17.940 に答える